Регулярное выражение, как найти все теги A, которые не содержат тег IMG внутри него? - PullRequest
0 голосов
/ 24 мая 2010

Давайте предположим, что у нас есть такой HTML-код.Нам нужно получить все теги <a href=""></a>, которые НЕ содержат тега img внутри него.

<a href="http://domain1.com"><span>Here is link</span></a>
<a href="http://domain2.com" title="">Hello</a>
<a href="http://domain3.com" title=""><img src="" /></a>
<a href="http://domain4" title=""> I'm the image <img src="" /> yeah</a>

Я использую это регулярное выражение для поиска всех ссылок тега:

preg_match_all("!<a[^>]+href=\"?'?([^ \"'>]+)\"?'?[^>]*>(.*?)</a>!is", $content, $out);

Я могу изменить это так:

preg_match_all("!<a[^>]+href=\"?'?([^ \"'>]+)\"?'?[^>]*>([^<>]+?)</a>!is", $content, $out);

Но как я могу сказать, чтобы исключить результаты, содержащие <img подстроку внутри <a href=""></a>?

Ответы [ 2 ]

3 голосов
/ 24 мая 2010

Вам необходимо использовать анализатор HTML, такой как Simple DOM parser . Вы не можете разобрать HTML с помощью регулярных выражений .

2 голосов
/ 24 мая 2010

Дом - это путь, но ради интереса вот решение:

Самый простой способ исключить определенные совпадения в регулярных выражениях - это использовать «отрицательный прогноз» или «отрицательный прогноз». Если отрицательное выражение найдено где-либо в строке, совпадение не выполняется.

Пример:

^(?!.+<img.+)<a href=\"?\'?.+\"?\'?>.+</a>$

Матчи:

<a href="http://domain1.com"><span>Here is link</span></a>
<a href="http://domain2.com" title="">Hello</a>

Но не совпадает:

<a href="http://domain3.com" title=""><img src="" /></a>
<a href="http://domain4" title=""> I'm the image <img src="" /> yeah</a>

Отрицательный взгляд вперед - эта часть строки:

(?!.+<img.+)

Это говорит о том, что не совпадает ни с одной строкой, в которой есть символы, за которыми следует image<a href=\"?\'?.+\"?\'?>.+</a>

Остальное мое общее соответствие для тегов привязки в html, вы можете использовать альтернативное выражение соответствия.

Возможно, вам придется пропустить начальный и конечный символы $ $ в зависимости от вашего использования.

Больше информации о взгляде вперед / назад

http://www.codinghorror.com/blog/2005/10/excluding-matches-with-regular-expressions.html

...