2010-08-27 3 views
1

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

Мне нужно вернуть совпадение (с php preg_match), если присутствует какой-либо из числовых html-тегов.

<p></p> 
<br> 
<h1></h1> 
<h2></h2> 

И не возвращать совпадение в противном случае. Так что ничего не в приведенном выше списке не удается, например:

<script></script> 
<table></table> 

ЭСТ

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

Кто-нибудь знает образец, который я могу использовать/адаптировать?

ответ

2
preg_match_all('/<([a-z]*)\b[^>]*>(.*?)</\1>/i'$html,$matches); 

Ломая выражение

Первого / является Разделитель

< является началом тега, самого первого <

в ([a-z]*) начинает соответствовать имени тега so fir instance < strong

\b[^>]* говорит, как только вы нашли место, продолжайте искать все слова

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

(.*?) говорит продолжайте искать и COLLECT (..) строку внутри, но becuse у нас есть ?, а затем прекратите искать, когда вы найдете следующий символ после закрытия фигурной скобки.

</\1> говорит, что я хочу, чтобы соответствовать, но только если значение внутри такой же, как в самом первом матче, это делается \1 как в матче , the value of this would be what's found with ([а-г] *) `.

, то вы можете использовать preg_match_all, чтобы найти все их содержание, то выходной массив будет что-то вроде

array(
    0 > THE WHOLE TAG 
    1 > TAG NAME 
    2 > TAG VALUE 
) 

Надеется, что это помогает :)

Exmaple

$allowed = array('b','strong','i','pre','code'); WHITELIST, never blacklist 
foreach($matchas as $match) 
{ 
    if(!in_array($match[1],$allowed)) 
    { 
     echo sprintf('The tag %s is disallowed!',$match[1]); 
    } 
} 
+0

Чтобы вернуть все теги в $ html, я мог бы проверить наличие нежелательных тегов? – YsoL8

+0

Да, плохое обновление с примером. – RobertPitt

+0

Спасибо! Выглядит прямо. – YsoL8

5

Несмотря на то, что это не обычная ситуация «I want to parse HTML with regular expressions», я бы рекомендовал использовать анализатор DOM, тем не менее, пройти через каждый элемент и прервать, если его нет в списке допустимых элементов.

См., Например, this question, чтобы начать.

Это могло бы стать чуть ли не один вкладыш с помощью расширения DOM парсер, как phpQuery если он поддерживает :not селектор и несколько имен тегов - я не знаю, никогда не работал с ним сам, но это будет легко найти вне. Основными примерами являются here.

2

Regex совершенно не подходит для проверки HTML для «безопасных» тегов. Не только это, но в HTML нет безопасных тегов. Каждому элементу могут быть присвоены атрибуты, разрешающие инъекцию скрипта (например, onclick, style -with-IE- expression() ...). Вы должны проверять каждый атрибут, а также каждый элемент.

Когда ваша безопасность поставлена ​​на карту, вам абсолютно необходим настоящий HTML-парсер для этого (тогда вы фильтруете элементы/атрибуты и сериализуете результаты). Есть так много способов уклониться от проверок на основе регулярных выражений, это даже не смешно.

Вы можете использовать DOMDocument::loadHTML, за которым следует DOM, чтобы сделать это, или вы можете использовать существующую библиотеку, такую ​​как htmlpurifier.

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