preg_match_all('/<([a-z]*)\b[^>]*>(.*?)</\1>/i'$html,$matches);
Разбивка выражения
Первый /
является разделителем
<
- начало тега, самое первое <
([a-z]*)
начинает совпадать с именем тега, поэтому экземпляр ели <<strong> strong
\b[^>]*
говорит, что как только вы нашли пробел, продолжайте искать все слова
>
говорит, что хочет, чтобы предыдущий раздел продолжал искать, пока не найдет самый первый >
(.*?)
говорит: продолжайте искать и СОБИРАЙТЕ (..) строку внутри, но у нас есть ?
, а затем прекращайте поиск, когда вы найдете следующий символ после закрывающей скобки.
</\1>
говорит, что я хочу сопоставить, но только если значение внутри совпадает с самым первым совпадением, это делается с помощью \1
, как в совпадении , the value of this would be what's found with
([az] *) `.
тогда вы можете использовать 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]);
}
}