2015-01-08 3 views
0

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

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

<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] (http://php.net/manual/en/book.xml.php) или [SimpleXML] (http: // php .net/manual/en/book.simplexml.php) или парсер HTML, такой как [реализация DOM] (http://php.net/manual/en/domdocument.loadhtml.php). – rid

+0

это может не ответить на ваш вопрос, но может решить вашу проблему, чтобы остановить синтаксический анализ (x) html с помощью регулярного выражения. Вы можете взглянуть на это: http://php.net/manual/de/book.simplexml.php и http://stackoverflow.com/questions/1732348/regex-match-open-tags-except- xhtml-self-contains-tags –

+0

Дальнейшее поощрение использования парсера HTML, а не регулярного выражения: ** [htmlparsing.com] (http://htmlparsing.com/) ** – funkwurm

ответ

2

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

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

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

+0

Это работает блестяще - большое спасибо. –

0
<p.*?>.*?<iframe.*?><\/iframe><\/p> 

Try this.See demo.

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

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

/<p[^.]*>[^<]*<iframe[^>]*><\/iframe><\/p>/is 
Смежные вопросы