PHP->HTML: проверить атрибуты HTML тегов (априори, парсинг HTML)
В данный момент я работаю над проектом, в котором любой пользователь извне может принять участие. В таких условиях приходиться внимательно следить за вводом HTML кода, поэтому я потратил достаточно много времени на написание функционала, отвечающего за фильтрацию пользовательского ввода.
Если нежелательные теги и можно отсеять, используя встроенную функцию PHP strip_tags(), то для проверки атрибутов разрешённых HTML тегов придётся изобретать свой велосипед. Для чтения атрибутов, их параметров, названия тегов можно использовать эту функцию:
Функция пройдётся по HTML-вводу и найдя теги (< и >) вернёт массив вида:
Этот массив можно использовать для замены нежелательных тегов, атрибутов и параметров (например style="padding: 5000px;") ;)
Второй, необязательный параметр, задаёт режим чтения. По умолчанию - мультибайтовый (подойдёт для UTF-8).
Простейший пример запуска после объявления функции:
Пример запуска, с отключением мультибайтовости:
- function read_htmlAttrs ($source, $mb = true)
- {
- $m = 'strlen';
- $m_s = 'substr';
- if ($mb)
- {
- $m = 'mb_'.$m;
- $m_s = 'mb_'.$m_s;
- }
- $srcLen = $m ($source);
- $mode = 'full_idle';
- for ($x=0; $x<=$srcLen; $x )
- {
- $s = $m_s ($source, $x, 1);
- if ($mode=='full_idle' && $s=='<')
- {
- if ($m_s ($source, $x, 2)!='</')
- $mode = 'read_tag_name';
- continue;
- }
- {
- if ($s=='>')
- {
- $mode = 'close_tag';
- continue;
- }
- {
- $mode='read_attr_name';
- continue;
- }
- $tmp['tagName'] .= $s;
- }
- {
- if ($s=='>')
- {
- $mode = 'close_tag';
- continue;
- }
- if ($s=='=')
- {
- $mode = 'read_param';
- continue;
- }
- $tmp['attrName'] .= $s;
- continue;
- }
- {
- {
- if ($s==' ') continue;
- $mode='read_attr_name';
- continue;
- }
- if ($s=='/') continue;
- if ($s=='>')
- {
- $mode = 'close_tag';
- continue;
- }
- $tmp['param'] .= $s;
- continue;
- }
- if ($mode=='close_tag')
- {
- $mode = 'full_idle';
- }
- }
- return $result;
- }
Это результат работы функции над:
<span ass="dev" dev="ass">ololo</span>
$source = read_htmlAtrrs ($_POST['content']);
$source = read_htmlAtrrs ($_POST['content'], 0);
Cychofs 08 сентября в 05:25 #
priligy buy online usa E, Experiments using complex matings of 2 different KO lines to create a double KO require 4 groups for comparison
Cychofs 08 сентября в 05:25 #
priligy buy online usa E, Experiments using complex matings of 2 different KO lines to create a double KO require 4 groups for comparison