REGEX для соответствия строки точно

0

У меня немного проблем с сопоставлением строки с использованием REGEX (PHP).

У нас есть этот код:

<p style="text-align: center; ">
    <iframe height="360" src="http://example.com/videoembed/9338/" frameborder="0" width="640"></iframe></p>

У нас есть этот REGEX:

/<p.*>.*<iframe.*><\/iframe><\/p>/is

Однако это также соответствует всем абзацам абзаца в строке, а не только те, которые содержат метки IFRAME. Как мы можем сопоставлять только теги P, содержащие IFRAME?

Мы также хотим сопоставить этот код с использованием того же REGEX:

<p style="text-align: center;"><iframe allowfullscreen="" frameborder="0" height="360" src="http://example.com/videoembed/9718/" width="640"></iframe></p>

Обратите внимание, что нет разрывов строк и меньше пробелов (в теге P).

Как мы можем достичь этого? Я немного новичок в REGEX.

Благодарим вас за помощь.

  • 4
    Вам определенно следует использовать не regex для этой задачи, а анализатор XML, такой как XML Parser или SimpleXML , или анализатор HTML, такой как реализация DOM .
  • 0
    это может не ответить на ваш вопрос, но может решить вашу проблему, чтобы прекратить синтаксический анализ (x) HTML с помощью регулярных выражений. Вы можете взглянуть на это: php.net/manual/de/book.simplexml.php и stackoverflow.com/questions/1732348/…
Показать ещё 2 комментария
Теги:
iframe

3 ответа

2
Лучший ответ

Сопоставьте только пробельные символы между <p> и <iframe>:

/<p[^>]*>\s*<iframe[^>]*><\/iframe>\s*<\/p>/is

Я также добавил исключение для > вместо любого char (.).

  • 0
    Это работает блестяще - большое спасибо.
0
<p.*?>.*?<iframe.*?><\/iframe><\/p>

Попробуйте это. Смотрите демоверсию.

https://regex101.com/r/sH8aR8/30

$re = "/<p.*?>.*?<iframe.*?><\\/iframe><\\/p>/is";
$str = "<p style=\"text-align: center; \">\n <iframe height=\"360\" src=\"http://example.com/videoembed/9338/\" frameborder=\"0\" width=\"640\"></iframe></p>\n\n<p style=\"text-align: center;\"><iframe allowfullscreen=\"\" frameborder=\"0\" height=\"360\" src=\"http://example.com/videoembed/9718/\" width=\"640\"></iframe></p>";

preg_match_all($re, $str, $matches);

Просто сделать ваши * жадные операторы non greedy *?

0

Используйте [^>] * вместо. * Like:

/<p[^.]*>[^<]*<iframe[^>]*><\/iframe><\/p>/is

Ещё вопросы

Сообщество Overcoder
Наверх
Меню