Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Выловить тег, внутри которого не будет такого же
 
 автор: abr_regexp   (19.12.2011 в 21:38)   письмо автору
 
 

Помогите составить regexp. Голова уже не варит..
Нужно найти строку "<a>.*</a>", причём внутри данного тега не должно быть строк "<a>" и "</a>".
Например "<a>текст</a>" катит, а "<a> текст <a> текст </a>" - не катит.

  Ответить  
 
 автор: abr_regexp   (19.12.2011 в 21:49)   письмо автору
 
   для: abr_regexp   (19.12.2011 в 21:38)
 

Ну или как сделать, найти строки <a>.*</a>, в которых бы не было строки "111"?
Вот, например "/<a>[^4]*<\/a>/" отсеивает все строки, где между <a> и </a> встречается четвёрка. А вот как указать не один символ, а строку?

  Ответить  
 
 автор: duhon   (20.12.2011 в 12:53)   письмо автору
 
   для: abr_regexp   (19.12.2011 в 21:38)
 

пробуй
<?php preg_match_all('#<a>(?>(?!</?a>).)*</a>#''<a>aaa<a>aaa</a>'$matches); ?>

вместо </?a> можешь поместить все что не должно быть между тегами <a></a>
если многострочный текст то воспользуйся модификатором s

  Ответить  
 
 автор: abr_regexp   (20.12.2011 в 21:24)   письмо автору
 
   для: duhon   (20.12.2011 в 12:53)
 

Спасибо! Я за сутки на 5 форумов щё написал просьбу, но твой ответ, duhon, похоже, самый подходящий оказался!

  Ответить  
 
 автор: Deed   (21.12.2011 в 23:16)   письмо автору
 
   для: duhon   (20.12.2011 в 12:53)
 

duhon, дружище!
Все в Вашей регулярке понятно, кроме (?>
Как эту конструкцию понимать?
Спасибо.

  Ответить  
 
 автор: duhon   (22.12.2011 в 13:12)   письмо автору
 
   для: Deed   (21.12.2011 в 23:16)
 

ненужная оптимизация.
вообще когда писал ориентировался на то что бы внутри (?>...)* не сохраняло возвраты, как бы целая единица данных, так как на практике у меня бывало что можно дописать внутрь какие нибудь квантификаторы, к которым может возвратиться регекс, и опережающая проверка может сработать частично, а не полная проверка может сломать всю логику регулярки.

короче немного запутано вышло, вот очень абстрактный пример:
preg_match_all('#<a>(?:\PL*(?!</?a>).)*</a>#', '<a>aaa<a>aaa</a>a<a> тут левый текст')

preg_match_all('#<a>(?>\PL*(?!</?a>).)*</a>#', '<a>aaa<a>aaa</a>a<a> тут левый текст')

представим теоретически что кто то не подумав изменил регулярку, добавил \PL*, да результат будет другой, найдет другие данные, и вообще это глупо, но если программиста устоит вариант то он так и оставит(незабываем что это абстактный пример). Так вот оба варианта будут показывать одинаковый результат поиска, но второй вариант делает меньше возвратов. Начиная с самого начала искомого текста, первая регулярка сделает 3938 сдвигов, а вторая 83 сдвигов курсора, плюс такая разница будет на каждом шагу перед текстом '<a>'. Ну и если представить в боевых условиях, где текста очень много то в теории это может сэкономить относительно много времени.

Но лучше не пользоваться (?>. В этом есть и обратная сторона медали, что может и не найти то что ожидаешь. Я сам себя учу перестать его использовать.

  Ответить  
 
 автор: Deed   (23.12.2011 в 09:24)   письмо автору
 
   для: duhon   (22.12.2011 в 13:12)
 

Ух ты!
Спасибо!!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования