規範に合わないhtml段落php処理細則


最近アマチュアがrss集約アプリケーションを維持していると、strip_で多くのサイトfeedのエントリの要約に様々な問題があることがわかりました.tagsは一刀で切りましょう.要約の段落とスタイルが歪んでいます.
たとえば、指定した要約の長さの切断など、出力を切断するWebサイトのサマリーがあります.これにより、閉じていないhtmlラベルがサマリーに表示されます.次のサマリーは例です.
$str=<<<EOF
<P>  【       】      ,           2013     ,             。         ,            ,                  。</P>
 <P align=center><IMG style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="2.2GHz  800         N   " align=1 src="http://imgm.cnmo.com/cnmo_product/18_500x375/698/ceFYnyzZgUijQ.jpg"><BR>2012      HTC Butterfly</P>
 <P>    2012 ,                  ,                    ,           。  2013   ,          ,                     ,               。</P>
 <P>        ,                         ,               ,         。     ,                ,                 。</P>
 <P align=center><IMG style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="6.44     800       N   " src="http://img.cnmo-img.com.cn/905/904155.jpg"></P>
 <P>          ,                  ,    ,             。           2013         N  ,            。<STRONG>
EOF;

上の要約にはいくつかの不正があります.
1.htmlタグ大文字
2.最後のstrongは、切断が正常に閉じていないため、strongの親ラベルpが失われます.
3.ラベルのプロパティには、align,styleなどのスタイルプロパティと定義が表示されます.
その影響についてお話しします
2:処理しない出力はページのスタイルを混乱させ、正常に閉じていないstrongブラウザのように後ろの出力を自動的にサブ要素として計算する.
3:スタイル定義はあなたのページスタイルに影響を与える可能性があります.画像はあなたの要約コンテナにあふれています.
1:視覚的なエラーは発生しませんが、htmlの合法性に影響します.
対処法についてお話しします
3:正則で属性を置き換えることができます.
preg_replace("/<([a-z][a-z0-9]*)(?:[^>]*(\ssrc=['\"][^'\"]*['\"]))?[^>]*?(\/?)>/i",'<$1$2$3>',$str);

2:DOMNode::C 14 Nメソッドで仕様できます.紛失したラベルを補うことができますが、になります.
など:1.なぜstripを使わないの?tagsは処理しますか?はい、指定したラベルを保持することもできますが、htmlentities 2に安全ではないラベルを渡します.domは属性を削除できるようですね!はい、これは以下に説明します.総合処理1,2,3のコードは以下の通りです.
$doc = new DOMDocument();
$doc->formatOutput=false;

$doc->loadHTML(mb_convert_encoding($str, 'HTML-ENTITIES', 'UTF-8'));
$nodes = $doc->getElementsByTagName('*');
foreach ( $nodes as $node ) {
	$delAtts=array();
	//         
	$nodeN=$node->tagName;
	$nodeAtts=$node->attributes;
	foreach($nodeAtts as $attN=>$att){
		// img  src  
		if(strtolower($attN)=='src' && strtolower($nodeN)=='img') continue;
		//          
		array_push($delAtts,$attN);
	}
	foreach($delAtts as $A){
		$node->removeAttribute($A);
	}
}
$doc->saveHTML();
$pstr=$doc->GetElementsByTagName('body')->item(0)->C14N();
//clear empty tag
$pstr=preg_replace('/<(\w+)>(\s| )*<\/\1>/i',"",$pstr);

だいたいOK、$pstrの内容はbody小包の$strで、最後にbodyを解決するだけでいいです.
最後に言いたいことはいくつかあります.
1.プロパティを巡回するときに削除しないでください.たとえば、imgには3つのプロパティstyle、src、altがあります.これはstyleを削除するだけで、styleの後ろには削除されません.
2.必ずsaveHTML()の戻り値を後続処理の内容としないでください.結果は漢字が次のようになります.
  回首2012年,手机市场还
怖がらないでもう一度調整するだけ
mb_convert_encoding($str, 'UTF-8','HTML-ENTITIES')

さぼるために、その戻り値は使わないでください.
3.$doc->GetElementsByTagName('body')->item(0)->C14N();

次のように変更できます.
$doc->documentElement->C14N();

ただし、戻り値はbodyだけでなくhtmlタグもあるので、気にしないで使えます.GetElementsByTagNameよりも手間が省けます