2017-01-29 5 views
-1

タグに同じタグがある場合でも、2つのタグの間のすべてを見つけようとしています。タグ間のすべてを見つける

ここに例があります:this <tag id="1">is an <tag id="2">example</tag> for</tag> tags <tag id="3">in tags</tag>です。

私はタグの間にすべてを得ることができますが、ペア設定されたタグは取得できません。どのように私は次の</tag>を無視し、その後<tag>があるかどうか見て私の正規表現を伝えることができ<tag id="(.*?)">(.*?)</tag>

私の正規表現は次のようになりますか?そしてそれは無限の時間です。

私はPHPで作業しているので、もっと速くて速い別の解決策がありますか?

出力は次のようになります。あなたがうまく構文を知っているし、PHPがビルドにしているこの構文を解析するためのツールですでに構造化文字列を持っている

id => content 
- 1 => is an <tag id="2">example</tag> for 
- 2 => example 
- 3 => in tags 
+0

[strip_tags](http://php.net/manual/en/function.strip-tags.php)は仕事をしませんか? – xzoert

+0

ありがとう、私はの間に何かがあることを忘れました。私はそれを私の例に加えました。もし私が必要とする 'id'の部分がなければ、strip_tagsは素晴らしいでしょう。 –

+0

出力を指定していません。 – revo

答えて

1

。正規表現や文字列関数を使用した文字列アプローチを使用する理由はありません。

この例では、DOMDocument::loadXMLの代わりにDOMDocument::loadHTMLを選択して、より寛大なパーサーを使用しますが、整形式のXML文書がある場合は、この変更は必要ありません。

各ノードにidという属性があると仮定しますが、必ずしもそうでない場合は、最初のforeachループでDOMNode::hasAttributeを使用してその存在をテストできます。

$html = 'this <tag id="1">is an <tag id="2">example</tag> for</tag> tags <tag id="3">in tags</tag>'; 

$dom = new DOMDocument; 
$state = libxml_use_internal_errors(true); 
$dom->loadHTML($html); 
libxml_use_internal_errors($state); 

$nodeList = $dom->getElementsByTagName('tag'); 

$results = []; 

foreach ($nodeList as $node) { 
    $content = ''; 
    foreach ($node->childNodes as $child) { 
     $content .= $dom->saveHTML($child); 
    } 
    $results[$node->getAttribute('id')] = $content; 
} 

print_r($results); 
+0

よろしくお願い致します。ただのスルー:同じbbcodes([b] .. [/ b]、[url = http:// ...] my url [/ url])の同じ例を使用することは可能ですか、それとも別の話題ですか? –

+0

@ Mr.Tr33:同じ考えです。構造化された文字列でもあり、bbcodeパーサを検索します。 –

関連する問題