2015-11-24 9 views
5

私は、文字列で閉じられていないHTMLタグを見つけるために、PHPや正規表現を使用しています:マッチ閉じられていないHTMLタグを正規表現を使用してPHP

これは私の文字列です:

$s="<div><h2>Hello world<h2><p>It's 7Am where I live<p><div>"; 

あなたがここにすべてのタグはありません見ることができます閉まっている。

閉じられていないタグをすべて検索したいのですが、問題は私の正規表現が開始タグと一致していることです。ここで

は、これまで

/<[^>]+>/i 

そして、この私のpreg_match_allである()関数

preg_match_all("/<[^>]+>/i",$s,$v); 

print_r($v); 

私の正規表現である私は閉じられていないタグを一致させるために、私の正規表現に変更するには何が必要ですか?

<h2> 
<p> 
<div> 
+1

あなたは 'tidy' http://php.net/manual/en/book.tidy.php – cmorrissey

+1

自己開発されたソリューションになります教育目的のために:基本的にタグ(開閉)とその他のテキスト断片を識別するトークナイザを構築する。開いたタグを保持しているスタックにトークンを繰り返します。開始タグがある場合は、それをスタックに配置します。終了タグがある場合は、相手がスタックの一番上にあるかどうかをチェックします。一致する場合は、スタックからスタックタグを削除します。それに応じて対応する(例えば、エラーを投げたり、遭遇した終了タグを破棄する)。 – Gumbo

+3

これは正規表現とは異なります。 – Brandin

答えて

11

あなたはこれを認識しませんかもしれませんが、DOMDocumentはあなたがHTMLを修正することができます。

$html = "<div><h2>Hello world<h2><p>It's 7Am where I live<p><div>"; 
libxml_use_internal_errors(true); 

$dom = new DOMDocument(); 
$dom->loadHTML('<root>' . $html . '</root>', LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 
$xpath = new DOMXPath($dom); 

foreach($xpath->query('//*[not(node())]') as $node) { 
    $node->parentNode->removeChild($node); 
} 
echo substr($dom->saveHTML(), 6, -8); 

IDEONE demo

結果を参照してください:<div><h2>Hello world</h2><p>It's 7Am where I live</p></div>

注DOMがDOMにHTMLをロードした後、空<h2></h2><p></p><div></div>タグが含まれているとして、XPathベースの空のノードのクリーンアップが必要であることを。

<root>要素が最初に追加され、ルート要素が正しく取得されることを確認します。後でsubstrで後処理することができます。

LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD DOMにDTDや他のごみが入らないようにフラグが必要です。

+0

.... nice one;) – swidmann

+0

あなたのオープニングラインbtw。それでも、イデオンは "執り士"。何度も私はそれへのリンクを含む答えを見ただけで、1年かそこらになると空白になっていることが分かりました。それについてのちょっとした副作用。 Q&Aのためのグーグルのもの、私はこれらの空白のイドンURL(実際には今週)で答えを見つけることが多い。それがなぜ、私は分かりません。 *乾杯* –

+1

@ Fred-ii-:はい、残念ながら、訪問されないと削除されます。しかし、私は答えの完全なコードを提供します。 –

2

未知のタグを見つけることは、根本的には正規表現ではあまりにも難しいようです。基本的には、各開始タグをキューに表示し、終了タグが表示されたときにそのタグをキューからポップする必要があります。

HTML検証を行うライブラリを使用することをお勧めします。これらの質問を参照してください。

Remove unmatched HTML tags in a string

How to find the unclosed div tag

PHP get all unclosed HTML tags in string

関連する問題