2015-12-13 4 views
0

Мой регулярное_выражение:PHP регулярное выражение разбора HTML

<([a-zA-Z0-9]+)>[\na-zA-Z0-9]*<\/\1+> 

моя строка:

<div> 
<f> 
</f> 
</div> 

результат:

array(2 
    0 => array(1 
    0 => <f> 
</f> 
) 
1 => array(1 
0 => f 
) 
) 

почему она захватывает <f></f>, и не обращая внимания на первый <div>?

+0

html НЕ МОЖЕТ быть проанализирован с помощью регулярных выражений, за исключением простых вещей. Вы пытаетесь выполнить синтаксический анализ всего html-фрагмента с помощью регулярного выражения, которое не может быть выполнено, за исключением случаев, когда вы применяете регулярное выражение рекурсивно (что означает, что внутри ярлыков xml могут присутствовать новые HTML-фрагменты, которые НЕ МОЖЕТ быть выполнены с одним регулярным выражением) –

+0

Поскольку '<' and '> 'не входят в ваш второй класс символов. –

+0

@NikosM .: это неверно, pcre (механизм регулярных выражений, используемый PHP) имеет функцию рекурсии. –

ответ

0

Я бы сказал, что это потому, что ваш второй оператор класса символов пытается найти 0 или более символов до окончания тега окончания, и это не соответствует блоку <div>...</div>.

2

Ответ на вопрос ИСПОЛЬЗУЙТЕ ПАРСЕР ВМЕСТО (извините за мой , кричащий). Хотя иногда быстрее использовать регулярное выражение для получения строки идентификатора или URL-адреса, html-тегам требуется довольно склонный к ошибкам способ понимания через регулярное выражение. Рассмотрим следующий код, не так ли красивее, чем друидические персонажи со специальными значениями?

<?php 
$str = " 
<container> 
    <div class='someclass' data='somedata'> 
     <f>some content here</f> 
    </div> 
</container>"; 
$xml = simplexml_load_string($str); 

echo $xml->div->f; // some content here 
$attributes = $xml->div->attributes(); 
print_r($attributes); // class and data as keys 
?> 
+0

Я бы согласился, хотя пользователь, скорее всего, хочет использовать подход, основанный на регулярном выражении (даже если субоптимальный) –

Смежные вопросы