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

kuzenstudio

Client
Регистрация
26.06.2010
Сообщения
139
Благодарностей
29
Баллы
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
Сообщения
22 451
Благодарностей
10 009
Баллы
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
Благодарностей
29
Баллы
28

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
22 451
Благодарностей
10 009
Баллы
113

kuzenstudio

Client
Регистрация
26.06.2010
Сообщения
139
Благодарностей
29
Баллы
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
Сообщения
22 451
Благодарностей
10 009
Баллы
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
Благодарностей
29
Баллы
28
  • Спасибо
Реакции: Sergodjan

kuzenstudio

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

Sergodjan

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

kuzenstudio

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

backoff

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

kuzenstudio

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

backoff

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

Astraport

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

kuzenstudio

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

backoff

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

backoff

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

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

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

Astraport

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

kuzenstudio

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

backoff

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

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

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

backoff

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

kuzenstudio

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

Yuriy Zymlex

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

Изучите:

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

Astraport

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

backoff

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

Astraport

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

backoff

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

backoff

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

Astraport

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

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