Помогите с регулярным выражением (<button class="c-button далее меняется data-id="рандом">Подписаться</button>)

kuzenstudio

Client
Регистрация
26.06.2010
Сообщения
139
Благодарностей
28
Баллы
28
Добрый помогите с регуляркой, измучился. Нужно отловить "Подписаться"
Всегда присутствует в начале <button class="c-button далее меняется data-id="рандом">Подписаться</button>

<button class="c-button c-button--primary c-button--subs " data-role="subscribe" data-type="user" data-id="332322">
Подписаться</button>
Заранее Спасибо !
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 516
Благодарностей
8 703
Баллы
113
Добрый помогите с регуляркой, измучился. Нужно отловить "Подписаться"
Можно рандомный номер заменить в регулярке на ".*?" (без кавычек).
Регулярка: (?<=<button\ class="c-button\ c-button--primary\ c-button--subs\ "\ data-role="subscribe"\ data-type="user"\ data-id=".*?">)[\w\W]*?(?=</button>)

75303
 
  • Спасибо
Реакции: kuzenstudio

kuzenstudio

Client
Регистрация
26.06.2010
Сообщения
139
Благодарностей
28
Баллы
28

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 516
Благодарностей
8 703
Баллы
113

kuzenstudio

Client
Регистрация
26.06.2010
Сообщения
139
Благодарностей
28
Баллы
28
Регулярка в том виде как я ее написал в посте - не срабатывает?
Нет, там помимо смены class, пробелы добавляются, постоянно только одно начало: <button class="c-button , конец data-id="рандом">Подписаться</button>

Такие варианты бывают:

<button class="c-button c-button--primary c-button--subs " data-role="subscribe" data-type="user" data-id="332322">
Подписаться</button>
<button class="c-button c-button--primary c-button--subs c-button--darkgray is-pressed" data-role="subscribe" data-type="user" data-id="332322" data-subscribed="">Подписаться</button>
 
Последнее редактирование:

August TS

Client
Регистрация
28.09.2018
Сообщения
7
Благодарностей
10
Баллы
3
По правилам же квантификаторы в ретроспективной проверке не работают. Т.е нельзя так (?<=.*) или (?<=.+), даже диапазон не принимает (?<=\d{1,10})
Если data-id всегда 6 цифр, можно такой костыльной
(?<=data-id="\d{6}">).*?(?=<\/button>)
Если класс важен, то и его добавить в проверку.

X(?=Y)​
⟶​
Позитивная опережающая X, если за ним следует Y
X(?!Y)​
⟶​
Негативная опережающая X, если за ним НЕ следует Y
(?<=Y)X
⟶​
Позитивная ретроспективная X, если следует за Y
(?<!Y)X
⟶​
Негативная ретроспективная X, если НЕ следует за Y
 
Последнее редактирование:

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 516
Благодарностей
8 703
Баллы
113
Нет, там помимо смены class, пробелы добавляются, постоянно только одно начало: <button class="c-button , конец data-id="рандом">Подписаться</button>

Такие варианты бывают:

<button class="c-button c-button--primary c-button--subs " data-role="subscribe" data-type="user" data-id="332322">
Подписаться</button>
<button class="c-button c-button--primary c-button--subs c-button--darkgray is-pressed" data-role="subscribe" data-type="user" data-id="332322" data-subscribed="">Подписаться</button>
Попробуйте такую регулярку: (?<=<button\s+class="c-button\s+c-button--primary\s+c-button--subs.*?"\s+data-role="subscribe"\s+data-type="user"\s+data-id=".*?".*?>)[\w\W]*?(?=</button>)
 
  • Спасибо
Реакции: kuzenstudio

kuzenstudio

Client
Регистрация
26.06.2010
Сообщения
139
Благодарностей
28
Баллы
28
  • Спасибо
Реакции: Sergodjan

kuzenstudio

Client
Регистрация
26.06.2010
Сообщения
139
Благодарностей
28
Баллы
28
Что бы не плодить темы, помогите по сравнению
'{-Variable.button-}' == '{-Variable.sravnenie-}' что не так делаю '{-Тут результат-Подписатся-}' == '{-Тут результат-Подписатся-}'
Или два слова сравнивать нельзя ?
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 516
Благодарностей
8 703
Баллы
113
Что бы не плодить темы, помогите по сравнению
'{-Variable.button-}' == '{-Variable.sravnenie-}' что не так делаю '{-Тут результат-Подписатся-}' == '{-Тут результат-Подписатся-}'
Или два слова сравнивать нельзя ?
Скорее всего, просто нужно обработать переменные перед сравнением с помощью "Обработка текста - Trim", чтобы убрать переводы строк, которые могут быть.
 
  • Спасибо
Реакции: kuzenstudio

kuzenstudio

Client
Регистрация
26.06.2010
Сообщения
139
Благодарностей
28
Баллы
28
Скорее всего, просто нужно обработать переменные перед сравнением с помощью "Обработка текста - Trim", чтобы убрать переводы строк, которые могут быть.
В точку, спасибо !
 
  • Спасибо
Реакции: Sergodjan

backoff

Client
Регистрация
20.04.2015
Сообщения
5 931
Благодарностей
6 389
Баллы
113
делайте через xpath - проще, быстрее, надежнее (так, совет на будущее)
 
  • Спасибо
Реакции: Yuriy Zymlex

kuzenstudio

Client
Регистрация
26.06.2010
Сообщения
139
Благодарностей
28
Баллы
28

backoff

Client
Регистрация
20.04.2015
Сообщения
5 931
Благодарностей
6 389
Баллы
113
  • Спасибо
Реакции: kuzenstudio

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 944
Благодарностей
4 353
Баллы
113
делайте через xpath - проще, быстрее, надежнее (так, совет на будущее)
Можешь доказать как сделать в предложенном случае проще, быстрее и надежнее (жесть) через xPath?
 

kuzenstudio

Client
Регистрация
26.06.2010
Сообщения
139
Благодарностей
28
Баллы
28
Вопросик еще такой, при взятии и обработки регуляркой в цикле, на 3 круге происходит зависание ProjectMaker7.1.7.1 и висит достаточно долго, может вообще не выйти.
Из за чего такое может быть ?
 

backoff

Client
Регистрация
20.04.2015
Сообщения
5 931
Благодарностей
6 389
Баллы
113
Можешь доказать как сделать в предложенном случае проще, быстрее и надежнее (жесть) через xPath?
лучше всего иметь конкретный пример страницы... а по тому что имеем, то вот так
C#:
//button[contains(text(),'Подписаться')]
так же из условия можно привязаться к data-role="subscribe"
 

backoff

Client
Регистрация
20.04.2015
Сообщения
5 931
Благодарностей
6 389
Баллы
113
Вопросик еще такой, при взятии и обработки регуляркой в цикле, на 3 круге происходит зависание ProjectMaker7.1.7.1 и висит достаточно долго, может вообще не выйти.
Из за чего такое может быть ?
изза того что зенка ахеривает от количества обрабатываемой информации. чем больше текста и тем более символов разных типа ) { [ ] ( } запятых точек и тп, регулярка их же считает как условием, но потом проверяет и понимает что это не условие... на все на это тратятся огромные ресурсы сервака

поэтому либо надо все экранировать, тримить весь дом, удалять из него ненужное, и потом работать с регуляркой - что на мой взгляд дикий гемор и бред
либо юзать xpath = профит

а судя по условию в старт посте, это явно какя-то соц сеть, а там просто дохера ненужной инфы для обработки
 
  • Спасибо
Реакции: kuzenstudio

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 944
Благодарностей
4 353
Баллы
113

kuzenstudio

Client
Регистрация
26.06.2010
Сообщения
139
Благодарностей
28
Баллы
28

backoff

Client
Регистрация
20.04.2015
Сообщения
5 931
Благодарностей
6 389
Баллы
113
Нда... Ну я так и думал, что ответ будет таким.
шо не так-то

А как получить эту "Подписаться" или "Читаю" через xpath ?
кубик "получить значение" или снипеет

ps \ я же написал, что xpath составляю по конкретной странице, а не куску кода .. в любом случае xpath мощнее и лучше.
 
Последнее редактирование:

backoff

Client
Регистрация
20.04.2015
Сообщения
5 931
Благодарностей
6 389
Баллы
113

kuzenstudio

Client
Регистрация
26.06.2010
Сообщения
139
Благодарностей
28
Баллы
28

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 381
Благодарностей
3 304
Баллы
113
Имеете в виду получить данные не через DOM, а через xpath ?
XPath работает как раз с DOM, но есть методы для работы и с html/xml файлом.

Изучите:

Спасибо, так гораздо лучше и быстрее !
И проще чем регулярки.
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 944
Благодарностей
4 353
Баллы
113
Жаль что ТС исправил старт-пост.
sergodjan66 стал абсолютно правильно давать рекомендации исходя из условий задачи.
И никакие бы xPath конструкции не помогли.
 

backoff

Client
Регистрация
20.04.2015
Сообщения
5 931
Благодарностей
6 389
Баллы
113
Жаль что ТС исправил старт-пост.
а в чем заключалась суть?
давай, мне даже самому стало интересно, и в любом случае докажу, что xpath гораздо проще и лучше в ЛЮБОЙ СИТУАЦИИ с путем до элемента
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 944
Благодарностей
4 353
Баллы
113
а в чем заключалась суть?
Суть в том, что сначала ТС описывал задачу, что нужно найти элемент по ОДНОВРЕМЕННОМУ СОВПАДЕНИЮ двух атрибутов с ДИНАМИЧЕСКИМИ полями в которых есть только частично СТАТИЧЕСКАЯ строка.
 

backoff

Client
Регистрация
20.04.2015
Сообщения
5 931
Благодарностей
6 389
Баллы
113
Суть в том, что сначала ТС описывал задачу, что нужно найти элемент по ОДНОВРЕМЕННОМУ СОВПАДЕНИЮ двух атрибутов с ДИНАМИЧЕСКИМИ полями в которых есть только частично СТАТИЧЕСКАЯ строка.
ваще на раз такое делается
 

backoff

Client
Регистрация
20.04.2015
Сообщения
5 931
Благодарностей
6 389
Баллы
113

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 944
Благодарностей
4 353
Баллы
113
ваще на раз такое делается
Ну да, погорячился о том, что ХPath не справится. Справится с помощью условия and, но точно также как и классический метод.
Ничем не лучше.
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)