|
|
|
| Помогите составить regexp. Голова уже не варит..
Нужно найти строку "<a>.*</a>", причём внутри данного тега не должно быть строк "<a>" и "</a>".
Например "<a>текст</a>" катит, а "<a> текст <a> текст </a>" - не катит. | |
|
|
|
|
|
|
|
для: abr_regexp
(19.12.2011 в 21:38)
| | Ну или как сделать, найти строки <a>.*</a>, в которых бы не было строки "111"?
Вот, например "/<a>[^4]*<\/a>/" отсеивает все строки, где между <a> и </a> встречается четвёрка. А вот как указать не один символ, а строку? | |
|
|
|
|
|
|
|
для: abr_regexp
(19.12.2011 в 21:38)
| | пробуй
<?php preg_match_all('#<a>(?>(?!</?a>).)*</a>#', '<a>aaa<a>aaa</a>', $matches); ?>
|
вместо </?a> можешь поместить все что не должно быть между тегами <a></a>
если многострочный текст то воспользуйся модификатором s | |
|
|
|
|
|
|
|
для: duhon
(20.12.2011 в 12:53)
| | Спасибо! Я за сутки на 5 форумов щё написал просьбу, но твой ответ, duhon, похоже, самый подходящий оказался! | |
|
|
|
|
|
|
|
для: duhon
(20.12.2011 в 12:53)
| | duhon, дружище!
Все в Вашей регулярке понятно, кроме (?>
Как эту конструкцию понимать?
Спасибо. | |
|
|
|
|
|
|
|
для: 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>'. Ну и если представить в боевых условиях, где текста очень много то в теории это может сэкономить относительно много времени.
Но лучше не пользоваться (?>. В этом есть и обратная сторона медали, что может и не найти то что ожидаешь. Я сам себя учу перестать его использовать. | |
|
|
|
|
|
|
|
для: duhon
(22.12.2011 в 13:12)
| | Ух ты!
Спасибо!! | |
|
|
|