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

ZennoScript

Moderator
Регистрация
04.03.2011
Сообщения
4 452
Благодарностей
1 886
Баллы
113
Регистрация
22.12.2015
Сообщения
96
Благодарностей
1
Баллы
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
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 126
Баллы
113
Код:
(?<=<a href ?= ?").*?(?=".*Контакты)
Брать последнее совпадение.
 
Регистрация
22.12.2015
Сообщения
96
Благодарностей
1
Баллы
8
Код:
(?<=<a href ?= ?").*?(?=".*Контакты)
Брать последнее совпадение.
Ни то что хотелось бы. Нужно написать универсальную регулярку из расчета, что контакты могут быть не последними. А получить регуляркой нужно вот такую конструкцию <a href="/index.php/kontakty" >Контакты</a> или вот такую <a href="/index.php/kontakty" class="menu"><span class="test">Контакты</span></a>
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 126
Баллы
113
Ни то что хотелось бы. Нужно написать универсальную регулярку из расчета, что контакты могут быть не последними. А получить регуляркой нужно вот такую конструкцию <a href="/index.php/kontakty" >Контакты</a> или вот такую <a href="/index.php/kontakty" class="menu"><span class="test">Контакты</span></a>
Ну вы бы для начала протестировали.
 
Регистрация
22.12.2015
Сообщения
96
Благодарностей
1
Баллы
8
Ну вы бы для начала протестировали.
Это первое, что я сделал, когда увидел ваш пост)))

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

Вложения

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 126
Баллы
113
Это первое, что я сделал, когда увидел ваш пост)))

Проблема в том, что если бы Контакты находились в середине то "Брать последнее совпадение", как вы написали, не помогло бы решить задачу)
Вот это я и имел ввиду проверить.
Абсолютно без разницы в каком месте кода находится ссылка на контакты - при парсинге этой регуляркой, нужная ссылка всегда будет последним результатом.
 
Регистрация
22.12.2015
Сообщения
96
Благодарностей
1
Баллы
8
Вот это я и имел ввиду проверить.
Абсолютно без разницы в каком месте кода находится ссылка на контакты - при парсинге этой регуляркой, нужная ссылка всегда будет последним результатом.
ах вот оно что))) потестил, вроде работает) Получается вы одной регуляркой сразу 2 действия сделали)) Попробую разобраться в ней) Спасибо)))
 
Регистрация
22.12.2015
Сообщения
96
Благодарностей
1
Баллы
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
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 126
Баллы
113
Последнее редактирование:
  • Спасибо
Реакции: Аркадий
Регистрация
22.12.2015
Сообщения
96
Благодарностей
1
Баллы
8

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 311
Благодарностей
1 191
Баллы
113
Как регуляркой убрать все скобки (и открывающие "(" и закрывающие ")") одним экшеном замены. Я сколько пробовал, никак не получается.
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 126
Баллы
113
Как регуляркой убрать все скобки (и открывающие "(" и закрывающие ")") одним экшеном замены. Я сколько пробовал, никак не получается.
Заменить \(|\) или [\(\)]+ на пустоту
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 311
Благодарностей
1 191
Баллы
113
Постоянно встречаю текст со скобками и все время из-за них вылазят ошибки в тексте при поиске одного текста среди другого. Есть ли способ как-то искать текст со скобкой среди другого выражения при помощи регулярных выражений, например "3 (n)" среди текста "12sadas23 (n) - 456sdsas3 (t)"?
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 126
Баллы
113
Постоянно встречаю текст со скобками и все время из-за них вылазят ошибки в тексте при поиске одного текста среди другого. Есть ли способ как-то искать текст со скобкой среди другого выражения при помощи регулярных выражений, например "3 (n)" среди текста "12sadas23 (n) - 456sdsas3 (t)"?
Скобки нужно экранировать символом "\". Ну и пробелы можно.
Код:
3\ \(n\)
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 311
Благодарностей
1 191
Баллы
113
Скобки нужно экранировать символом "\". Ну и пробелы можно.
Код:
3\ \(n\)
А если у меня каждый раз разный текст (миллионы вариантов расположения скобок) и может быть скобка и может её не быть, в разном месте бывают скобки, то есть ли возможность использовать регулярные выражения, чтобы проверить наличие текста. А то я пользуюсь заменой скобки на пустоту, но получается в итоге не слишком удобный для меня вариант в плане дальнейший действий.
 

Wide

Client
Регистрация
04.02.2013
Сообщения
946
Благодарностей
258
Баллы
63
старик., выручи очередной раз!!
есть регулярка для разбивки на количество слов
Код:
^( ?[^ ]+){10}
а есть предложение которое она не разбивает
Код:
планшет acer aspire switch 10 special sw5 015 nt g58er 001
я так подозреваю что из-за цифр и одиночных символов. только адвордс это один хер считает за предложение. выручи, а?))
 
Последнее редактирование:

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 642
Баллы
113
старик., выручи очередной раз!!
есть регулярка для разбивки на количество слов
Код:
^( ?[^ ]+){10}
а есть предложение которое она не разбивает
Код:
планшет acer aspire switch 10 special sw5 015 nt g58er 001
я так подозреваю что из-за цифр и одиночных символов. только адвордс это один хер считает за предложение. выручи, а?))
\b\w+\b
или
\b[^\W\d]+\b
 

Wide

Client
Регистрация
04.02.2013
Сообщения
946
Благодарностей
258
Баллы
63

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 126
Баллы
113
я так подозреваю что из-за цифр и одиночных символов.
Это не влияет. Скорее всего, где-то в строке вместо пробелов встречаются другие пробельные символы.
Попробуй так
Код:
^(\s?[^\s]+){10}
 
  • Спасибо
Реакции: Wide

Wide

Client
Регистрация
04.02.2013
Сообщения
946
Благодарностей
258
Баллы
63
Это не влияет. Скорее всего, где-то в строке вместо пробелов встречаются другие пробельные символы.
Попробуй так
Код:
^(\s?[^\s]+){10}
те же яйца, только в профиль)) что интересно при пошаговой отладке все нормально режет. походу бажится зенька))
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 642
Баллы
113

Sapfire65

Client
Регистрация
05.06.2016
Сообщения
103
Благодарностей
22
Баллы
18
Помогите написать регулярку.
Нужно всего лишь проверить наличие в поле ввода, текста и цифр.
 

Wide

Client
Регистрация
04.02.2013
Сообщения
946
Благодарностей
258
Баллы
63
что-то тс давно не появляется. ну да ладно, возможно кто то из форумчан подскажет. ситуация следующая, есть предложение:
слово1 слово2 слово3 слово4 слово5.
нужна регулярка которая будет разделять предложение по три слова, т.е. должно на выходе получится так
слово1 слово2 слово3
слово2 слово3 слово4
слово3 слово4 слово5
сейчас я разбиваю по два слова двумя регулярками, в два прохода
\w+\s\w+
\s\w+\s\w+
кто дружит с регулярками? подскажите братцы
 
Последнее редактирование:

mrstorm

Client
Регистрация
16.04.2015
Сообщения
205
Благодарностей
14
Баллы
18
Всем привет. Подскажите как составить регулярку для вот такой строки:
https://fotos/уааку/вуцац/793f1ad.jpg
чтобы на выходе было только 793f1ad.jpg? Перед последним слешем (/) всегда все разное!
Галочка "Самое короткое" не позволяет сделать то что нужно!
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 375
Благодарностей
2 041
Баллы
113
гугл помагает как взять имя файла, тип файла, путь км файлу,т зачем тему писать в разных ветках, неужели т рудно один раз в поиск забить
 

mrstorm

Client
Регистрация
16.04.2015
Сообщения
205
Благодарностей
14
Баллы
18
гугл помагает как взять имя файла, тип файла, путь км файлу,т зачем тему писать в разных ветках, неужели т рудно один раз в поиск забить
у меня нет никакого пути к файлу, и имени файла, файла даже нет. У меня есть только ссылка.
 

Bening

Client
Регистрация
25.05.2016
Сообщения
6
Благодарностей
0
Баллы
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
Регистрация
17.10.2013
Сообщения
346
Благодарностей
98
Баллы
28
<noindex>.*(РИА\ Новости|Новости\ Яндекс|ТАСС)[\w\W]*?</noindex>
А вообще надо контекст смотреть.
 

Bening

Client
Регистрация
25.05.2016
Сообщения
6
Благодарностей
0
Баллы
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>, а потом только удалю через замену из текста эти строки. Но это слишком муторно. Может есть метод как это проделать при парсинге, избегая лишних кубиков?
 

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