У меня немного проблем с сопоставлением строки с использованием 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.
Благодарим вас за помощь.
Сопоставьте только пробельные символы между <p>
и <iframe>
:
/<p[^>]*>\s*<iframe[^>]*><\/iframe>\s*<\/p>/is
Я также добавил исключение для >
вместо любого char (.
).
<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
*?
Используйте [^>] * вместо. * Like:
/<p[^.]*>[^<]*<iframe[^>]*><\/iframe><\/p>/is