Как сопоставить что-либо кроме шаблона между двумя тегами - PullRequest
0 голосов
/ 30 апреля 2010

Я пытаюсь сопоставить строку, которая состоит из HTML. По сути, это галерея изображений, поэтому в строке много общего. В строке много тегов <dl>, но я ищу, чтобы соответствовать последней комбинации <dl>(.?)+</dl>, которая предшествует </div>.

Способ, который я разработал для этого, - убедиться, что в комбо <dl></dl>, которое я сопоставляю, нет никаких <dl. Мне все равно, что там еще, включая другие теги и разрывы строк.

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

Вот мое текущее регулярное выражение, которое возвращает мне массив только с двумя значениями NULL:

preg_match_all('/<dl((?!<dl).)+<\/dl>(?=<\/div>)/', $foo, $bar)

Как вы можете видеть, я использую отрицательный взгляд, чтобы попытаться увидеть, есть ли еще один <dl> в этом. Я также пробовал негативно смотреть здесь с теми же результатами. Я также попытался использовать +? вместо + безрезультатно. Имейте в виду, что здесь нет шаблона <dl><dl></dl> или чего-либо еще, но мое регулярное выражение либо соответствует первому <dl> и последнему </dl>, либо вообще ничего.

Теперь я понимаю, что . не будет соответствовать разрывам строк, но я попробовал все, что мог себе представить, и он по-прежнему либо дает мне значения NULL, либо почти всю строку (с самого первого появления <dl). до </dl></div>, который включает в себя несколько других случаев <dl>, именно то, что я не хотел). Честно говоря, я не знаю, что делаю неправильно.

Спасибо за вашу помощь! Я потратил больше часа, пытаясь решить эту проблему, и это заставило меня выдернуть волосы.

Ответы [ 3 ]

2 голосов
/ 30 апреля 2010

Не используйте регулярные выражения для нерегулярных языков, таких как HTML . Вместо этого используйте парсер . Это сэкономит вам много времени и боль .

0 голосов
/ 30 апреля 2010

Как бы безумно это было, примерно через 2 минуты после того, как я опубликовал этот вопрос, я нашел способ, который сработал.

preg_match_all('/<dl([^\z](?!<dl))+?<\/dl>(?=<\/div>)/', $foo, $bar);

Сумасшествие [^\z] - это просто способ, которым я обычно говорил "соответствовать всем символам, даже разрывам строк"

0 голосов
/ 30 апреля 2010

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

В общем, я бы не советовал писать парсер с использованием регулярных выражений.

См. http://www.php.net/tidy

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...