Бесплатно напишу регулярное выражение. Часть 2.

ZennoScript

Moderator
Joined
Mar 4, 2011
Messages
4,452
Reaction score
1,888
Points
113
Скажите, а восклицательный знак какую роль в регулярке играет? Читал книгу по регулярки и что то там не было восклицательного метасимвола)))
Почитайте вот это.
 
Joined
Dec 22, 2015
Messages
96
Reaction score
1
Points
8
Столкнулся еще с одной проблемой... Попытался сам составить регулярное выражение и вроде регулярка должна работать как надо, но...

Задача состоит в следующем:

Имеется DOM дерево сайта. При помощи регулярного выражения нужно:
1. найти вот такую конструкци <a href="/index.php/kontakty" >Контакты</a> то есть весь тег с текстом "Контакты".
2. сохранить результат работы в переменную и при помощи регулярки получить url адрес (с этим этапом проблем не возникает, поэтому его пропускает)

Проблема с этапом №1

Я написал регулярное выражение:

(<a .+?>)Контакты(</[ ]?a>)

И как мне казалось, все должно было работать. Но нет:-) Находится куча ссылок вместо одной нужно при этом в них нет текста "Контакты", но они все равно находятся...

DOM дерево брал с этого сайта auto-pokrasim точка ru

Сюда файл с DOM загрузить не получилось.

Где я ошибся?

И возможно ли сделать регулярку более универсальной, к примеру если "Контакты" будут расположены вот так:

<a href="/index.php/kontakty" ><span class="test">Контакты</span></a>
 

Dimionix

Moderator
Joined
Apr 9, 2011
Messages
3,068
Reaction score
3,130
Points
113
Code:
(?<=<a href ?= ?").*?(?=".*Контакты)
Брать последнее совпадение.
 
Joined
Dec 22, 2015
Messages
96
Reaction score
1
Points
8
Code:
(?<=<a href ?= ?").*?(?=".*Контакты)
Брать последнее совпадение.
Ни то что хотелось бы. Нужно написать универсальную регулярку из расчета, что контакты могут быть не последними. А получить регуляркой нужно вот такую конструкцию <a href="/index.php/kontakty" >Контакты</a> или вот такую <a href="/index.php/kontakty" class="menu"><span class="test">Контакты</span></a>
 

Dimionix

Moderator
Joined
Apr 9, 2011
Messages
3,068
Reaction score
3,130
Points
113
Ни то что хотелось бы. Нужно написать универсальную регулярку из расчета, что контакты могут быть не последними. А получить регуляркой нужно вот такую конструкцию <a href="/index.php/kontakty" >Контакты</a> или вот такую <a href="/index.php/kontakty" class="menu"><span class="test">Контакты</span></a>
Ну вы бы для начала протестировали.
 
Joined
Dec 22, 2015
Messages
96
Reaction score
1
Points
8
Ну вы бы для начала протестировали.
Это первое, что я сделал, когда увидел ваш пост)))

Проблема в том, что если бы Контакты находились в середине то "Брать последнее совпадение", как вы написали, не помогло бы решить задачу)
 

Attachments

Dimionix

Moderator
Joined
Apr 9, 2011
Messages
3,068
Reaction score
3,130
Points
113
Это первое, что я сделал, когда увидел ваш пост)))

Проблема в том, что если бы Контакты находились в середине то "Брать последнее совпадение", как вы написали, не помогло бы решить задачу)
Вот это я и имел ввиду проверить.
Абсолютно без разницы в каком месте кода находится ссылка на контакты - при парсинге этой регуляркой, нужная ссылка всегда будет последним результатом.
 
Joined
Dec 22, 2015
Messages
96
Reaction score
1
Points
8
Вот это я и имел ввиду проверить.
Абсолютно без разницы в каком месте кода находится ссылка на контакты - при парсинге этой регуляркой, нужная ссылка всегда будет последним результатом.
ах вот оно что))) потестил, вроде работает) Получается вы одной регуляркой сразу 2 действия сделали)) Попробую разобраться в ней) Спасибо)))
 
Joined
Dec 22, 2015
Messages
96
Reaction score
1
Points
8
Вот это я и имел ввиду проверить.
Абсолютно без разницы в каком месте кода находится ссылка на контакты - при парсинге этой регуляркой, нужная ссылка всегда будет последним результатом.
А можно вашу регулярку еще немного улучшить, чтобы она справлялась и с таким вариантом? (пробовал свои варианты, но безрезультатно)

</li><li class="normal">
<a href="warranty/">
<span class="navigation-item-text">Гарантия</span>
</a>

</li><li class="normal">
<a href="contact-us/">
<span class="navigation-item-bullet">></span>
<span class="navigation-item-text">Контакты</span>
</a>

</li><li class="normal">
<a href="fotogalereya/">
<span class="navigation-item-bullet">></span>
<span class="navigation-item-text">Фотогалерея</span>
</a>
</li>
 

Dimionix

Moderator
Joined
Apr 9, 2011
Messages
3,068
Reaction score
3,130
Points
113
А можно вашу регулярку еще немного улучшить, чтобы она справлялась и с таким вариантом? (пробовал свои варианты, но безрезультатно)
Code:
(?<=<a href ?= ?").*?(?="[\w\W]*Контакты)
 
Last edited:
  • Thank you
Reactions: Аркадий
Joined
Dec 22, 2015
Messages
96
Reaction score
1
Points
8
Code:
(?<=<a href ?= ?").*?(?="[\w\W]*Контакты)
Спасибо все работает)) Даже немного усовершенствовать получилось)))
 

amyboose

Client
Joined
Apr 21, 2016
Messages
2,311
Reaction score
1,191
Points
113
Как регуляркой убрать все скобки (и открывающие "(" и закрывающие ")") одним экшеном замены. Я сколько пробовал, никак не получается.
 

Dimionix

Moderator
Joined
Apr 9, 2011
Messages
3,068
Reaction score
3,130
Points
113
Как регуляркой убрать все скобки (и открывающие "(" и закрывающие ")") одним экшеном замены. Я сколько пробовал, никак не получается.
Заменить \(|\) или [\(\)]+ на пустоту
 

amyboose

Client
Joined
Apr 21, 2016
Messages
2,311
Reaction score
1,191
Points
113
Постоянно встречаю текст со скобками и все время из-за них вылазят ошибки в тексте при поиске одного текста среди другого. Есть ли способ как-то искать текст со скобкой среди другого выражения при помощи регулярных выражений, например "3 (n)" среди текста "12sadas23 (n) - 456sdsas3 (t)"?
 

Dimionix

Moderator
Joined
Apr 9, 2011
Messages
3,068
Reaction score
3,130
Points
113
Постоянно встречаю текст со скобками и все время из-за них вылазят ошибки в тексте при поиске одного текста среди другого. Есть ли способ как-то искать текст со скобкой среди другого выражения при помощи регулярных выражений, например "3 (n)" среди текста "12sadas23 (n) - 456sdsas3 (t)"?
Скобки нужно экранировать символом "\". Ну и пробелы можно.
Code:
3\ \(n\)
 

amyboose

Client
Joined
Apr 21, 2016
Messages
2,311
Reaction score
1,191
Points
113
Скобки нужно экранировать символом "\". Ну и пробелы можно.
Code:
3\ \(n\)
А если у меня каждый раз разный текст (миллионы вариантов расположения скобок) и может быть скобка и может её не быть, в разном месте бывают скобки, то есть ли возможность использовать регулярные выражения, чтобы проверить наличие текста. А то я пользуюсь заменой скобки на пустоту, но получается в итоге не слишком удобный для меня вариант в плане дальнейший действий.
 

Wide

Client
Joined
Feb 4, 2013
Messages
970
Reaction score
261
Points
63
старик., выручи очередной раз!!
есть регулярка для разбивки на количество слов
Code:
^( ?[^ ]+){10}
а есть предложение которое она не разбивает
Code:
планшет acer aspire switch 10 special sw5 015 nt g58er 001
я так подозреваю что из-за цифр и одиночных символов. только адвордс это один хер считает за предложение. выручи, а?))
 
Last edited:

doc

Client
Joined
Mar 30, 2012
Messages
8,685
Reaction score
4,648
Points
113
старик., выручи очередной раз!!
есть регулярка для разбивки на количество слов
Code:
^( ?[^ ]+){10}
а есть предложение которое она не разбивает
Code:
планшет acer aspire switch 10 special sw5 015 nt g58er 001
я так подозреваю что из-за цифр и одиночных символов. только адвордс это один хер считает за предложение. выручи, а?))
\b\w+\b
или
\b[^\W\d]+\b
 

Wide

Client
Joined
Feb 4, 2013
Messages
970
Reaction score
261
Points
63
\b\w+\b
или
\b[^\W\d]+\b
а что делает ваша регулярка? у меня ею остается только первое слово, мне нужно первые 10
 

Dimionix

Moderator
Joined
Apr 9, 2011
Messages
3,068
Reaction score
3,130
Points
113
я так подозреваю что из-за цифр и одиночных символов.
Это не влияет. Скорее всего, где-то в строке вместо пробелов встречаются другие пробельные символы.
Попробуй так
Code:
^(\s?[^\s]+){10}
 
  • Thank you
Reactions: Wide

Wide

Client
Joined
Feb 4, 2013
Messages
970
Reaction score
261
Points
63
Это не влияет. Скорее всего, где-то в строке вместо пробелов встречаются другие пробельные символы.
Попробуй так
Code:
^(\s?[^\s]+){10}
те же яйца, только в профиль)) что интересно при пошаговой отладке все нормально режет. походу бажится зенька))
 

doc

Client
Joined
Mar 30, 2012
Messages
8,685
Reaction score
4,648
Points
113
а что делает ваша регулярка? у меня ею остается только первое слово, мне нужно первые 10
я неправильно понял. думал, нужно разбить на слова
 

Sapfire65

Client
Joined
Jun 5, 2016
Messages
103
Reaction score
22
Points
18
Помогите написать регулярку.
Нужно всего лишь проверить наличие в поле ввода, текста и цифр.
 

Wide

Client
Joined
Feb 4, 2013
Messages
970
Reaction score
261
Points
63
что-то тс давно не появляется. ну да ладно, возможно кто то из форумчан подскажет. ситуация следующая, есть предложение:
слово1 слово2 слово3 слово4 слово5.
нужна регулярка которая будет разделять предложение по три слова, т.е. должно на выходе получится так
слово1 слово2 слово3
слово2 слово3 слово4
слово3 слово4 слово5
сейчас я разбиваю по два слова двумя регулярками, в два прохода
\w+\s\w+
\s\w+\s\w+
кто дружит с регулярками? подскажите братцы
 
Last edited:

mrstorm

Client
Joined
Apr 16, 2015
Messages
209
Reaction score
14
Points
18
Всем привет. Подскажите как составить регулярку для вот такой строки:
https://fotos/уааку/вуцац/793f1ad.jpg
чтобы на выходе было только 793f1ad.jpg? Перед последним слешем (/) всегда все разное!
Галочка "Самое короткое" не позволяет сделать то что нужно!
 

ssXXXss

Client
Joined
Dec 23, 2014
Messages
7,375
Reaction score
2,042
Points
113
гугл помагает как взять имя файла, тип файла, путь км файлу,т зачем тему писать в разных ветках, неужели т рудно один раз в поиск забить
 

mrstorm

Client
Joined
Apr 16, 2015
Messages
209
Reaction score
14
Points
18
гугл помагает как взять имя файла, тип файла, путь км файлу,т зачем тему писать в разных ветках, неужели т рудно один раз в поиск забить
у меня нет никакого пути к файлу, и имени файла, файла даже нет. У меня есть только ссылка.
 

Bening

Client
Joined
May 25, 2016
Messages
6
Reaction score
0
Points
1
Доброго дня всем! Уважаемые, помогите с регуляркой. Есть HTML код:
<i>Это было частью сделки по ядерной программе"</i>, — цитирует представителя иранского правительства <noindex><a rel="nofollow" target="_blank" href="/go.php?link=http%3A%2F%2Fria.ru">РИА Новости</a></noindex>.

Из него нужно удалить теги <noindex></noindex> и ссылку на РИА Новости. Вместо РИА Новости в коде может быть и другой текст, ТАСС, Новости Яндекс и т.п. Нужно чтобы получилось вот так:
<i>Это было частью сделки по ядерной программе"</i>, — цитирует представителя иранского правительства РИА Новости.

И еще, посоветуйте, пожалуйста хороший мануал или книгу по регулярным выражениям. Заранее премного благодарен.
 

Severip

Client
Joined
Oct 17, 2013
Messages
346
Reaction score
99
Points
28
<noindex>.*(РИА\ Новости|Новости\ Яндекс|ТАСС)[\w\W]*?</noindex>
А вообще надо контекст смотреть.
 

Bening

Client
Joined
May 25, 2016
Messages
6
Reaction score
0
Points
1
<noindex>.*(РИА\ Новости|Новости\ Яндекс|ТАСС)[\w\W]*?</noindex>
А вообще надо контекст смотреть.
Спасибо, но это не совсем то. Попробовал предложенный вами вариант. Из строки:
<i>Это было частью сделки по ядерной программе"</i>, — цитирует представителя иранского правительства <noindex><a rel="nofollow" target="_blank" href="/go.php?link=http%3A%2F%2Fria.ru">РИА Новости</a></noindex>.
Парсится только: <noindex><a rel="nofollow" target="_blank" href="/go.php?link=http%3A%2F%2Fria.ru">РИА Новости</a></noindex>
Мне же нужно чтобы спарсило весь текст с html тегами, убрав только ноиндекс и ссылку на риа новости. Т.е. чтобы в результате парсинга выдало такое:
<i>Это было частью сделки по ядерной программе"</i>, — цитирует представителя иранского правительства РИА Новости.

Если конечно такое возможно? Уже третий день голову ломаю. Пока получилось сделать только так. Ищу в конечном тексте href="/go.php?link=http, если есть, то парсю текст чтобы получить <noindex><a rel="nofollow" target="_blank" href="/go.php?link=http%3A%2F%2Fria.ru"> и закрывающие теги </a></noindex>, а потом только удалю через замену из текста эти строки. Но это слишком муторно. Может есть метод как это проделать при парсинге, избегая лишних кубиков?
 

Users Who Are Viewing This Thread (Total: 1, Members: 0, Guests: 1)