PHP preg_match () проблема несжатого совпадения - PullRequest
0 голосов
/ 15 октября 2011

Я использую PHP-модификатор шаблона "U", чтобы инвертировать жадное поведение по умолчанию с помощью preg_match (). Тем не менее, это не работает так, как я хочу. Мой код:

$str = '<p>
<div><a aaa
    <a href="a.mov"></a>
  </div>
</p>';

$needle = "a.mov";

$pattern = "/\<a.*".preg_quote($needle, "/").".*\<\/a\>/sU";

preg_match($pattern, $str, $matches);
print_r($matches);

Я пытаюсь соответствовать на

<a href="a.mov"></a>

Но этот кусок кода возвращает меня

<a aaa
    <a href="a.mov"></a>

Может кто-нибудь пролить мне свет на то, где я поступил неправильно?

Ответы [ 2 ]

2 голосов
/ 15 октября 2011

Что ж, в более общем смысле вы ошиблись при попытке проанализировать HTML с помощью регулярных выражений, но в отношении предоставленного вами фрагмента кода проблема заключается в том, что модификатор ungreedy сообщает *, + и {n,}остановиться, как только они будут счастливы, вместо того, чтобы идти до конца.

Таким образом, это существенно влияет на то, где заканчивается совпадение, а не на то, где оно начинается - "нелюбовь" не предназначена для обозначения "дайте мне самое короткое возможное совпадение.

Вы можете как-то исправить этот конкретный пример, используя модификаторы mU вместо sU, чтобы . не совпадал с новыми строками.

0 голосов
/ 15 октября 2011

Мой массив тоже пуст. Вы должны быть осторожны с переносами строк, когда пытаетесь использовать Regex с HTML. Возможно, проблема с однострочным режимом.

См .: http://www.regular -expressions.info / dot.html

Я успешно проанализировал HTML с помощью регулярных выражений, но не буду этого делать в дальнейшем. Посмотрите на

http://simplehtmldom.sourceforge.net/

Ты никогда не оглянешься.

...