html парсер. Часть третья. Разбор текста. |
Наверное самая большая часть кода и самая важная тут.
function Parse($text){
$text=preg_replace($this- >ReplaceTagsFrom,$this- >ReplaceTagsTo,$text);
@preg_match_all('/([^< ]*?)< (/?)([^s]+?)((?:(?:s+(?:[w]+?)=("|')(?:[^5]*?)(?/',$text.'
',$textdrop);
$tags=array();
if(count($textdrop[0])==0)
return htmlspecialchars($text);
foreach($textdrop[0] as $id= >$line){
$pretext=$textdrop[1][$id];
$closetag=$textdrop[2][$id]=='/';
$curtag=strtolower($textdrop[3][$id]);
$tagparam=$textdrop[4][$id];
if ($closetag){
// TagClose
if ((count($tags) >0)&&($tags[0]==$curtag)){
$newtext.=htmlspecialchars($pretext).'< /'.$curtag.' >';
array_shift($tags);
continue;
}else{
$newtext.=htmlspecialchars($pretext).'< /'.$curtag.' >';
continue;
}
}
elseif (!isset($this- >allow[$curtag])){
}else{
// TagOpen
preg_match_all('/s([w]+?)=("|')((?:[^2]*?)(?,$tagparam,$params);
$param='';
foreach($params[0] as $pid= >$line){
if (in_array(strtolower($params[1][$pid]),$this- >allow[$curtag]))
if (strtolower($params[1][$pid])=='href'){
// Провека ссылок
preg_match('/(?:(w*?):)(.*)/',$params[3][$pid],$link);
if ((count($link)==0)||(in_array(strtolower($link[1]),$this- >AllowProtocols)))
$param.= ' '.$params[1][$pid].'='.$params[2][$pid].$params[3][$pid].$params[2][$pid];
}else
$param.= ' '.$params[1][$pid].'='.$params[2][$pid].$params[3][$pid].$params[2][$pid];
}
if (in_array($curtag,array_keys($this- >allow))){
if (!in_array($curtag,$this- >simpletag)){
array_unshift($tags,$curtag);
$newtext.=htmlspecialchars($pretext).'< '.$curtag.$param.' >';
}else{
$newtext.=htmlspecialchars($pretext).'< '.$curtag.$param.' / >';
}
continue;
}
}
$newtext.=htmlspecialchars($pretext).'< '.($closetag?'/':'').$curtag.htmlspecialchars($tagparam).' >';
}
foreach($tags as $tag)
$newtext.='< /'.$tag.' >';
return $newtext;
}
Если рассматривать работу данного скрипта по порядку, то:
Вот и готов текст.
Комментировать | « Пред. запись — К дневнику — След. запись » | Страницы: [1] [Новые] |