2

必ずしも制御する必要のないコンテンツに対してpreg_replaceを実行していて、通貨値(つまり$1.00)などを含む置換値の問題が発生しています。確かに、これは他の質問で対処されている一般的な問題です。私が見つけた最も近い解決策は次のとおりです。

http://www.procata.com/blog/archives/2005/11/13/two-preg_replace-escaping-gotchas/

私の問題はもっと複雑です。なぜなら、置換値は、少なくとも私が見ることができる方法では、事前に逃げることができるものではないからです。これが私のpregコードです:

$body = preg_replace('/<special_tag id="'.$tagID.'">(.*?)<\/special_tag>/','$1',$body);

ご覧のとおり、設定されたカスタムタグ内のすべてのコンテンツをキャプチャし、周囲の開始タグと終了タグを削除していますが、コンテンツは内部にあります。ただし、置換'$1'は必要なエスケープには役立ちません。そのため、置換値に含まれている通貨値が誤って終了します。

私はこの交換を考えすぎましたか?特定のタグの一意のIDを考慮に入れる必要があることを念頭に置いて、特別なタグを削除するために使用できるものは他にありますか?

どんな助けでも大歓迎です!

4

2 に答える 2

1

「落とし穴」を持たない可能性のあるDOMソリューション。

このHTMLを想定すると:

$html = <<< HTML
<html>
    <body>
        <special_tag id="foo">
            <p>Some content</p>
            <p>Some more content</p>
        </special_tag>
    </body>
</html>
HTML;

special_tagの子をプルアップし、後でspecial_tagを削除します。

// create DOMDocument, suppress parsing errors
$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTML($html);
libxml_clear_errors();

// get special_tag with id foo
$xpath = new DOMXPath($dom);
$foo = $xpath->query('//special_tag[@id="foo"]')->item(0);

// move all children before special_tag
while ($foo->childNodes->length > 0) {
    $foo->parentNode->insertBefore($foo->childNodes->item(0));
}

// remove now empty special_tag
$foo->parentNode->removeChild($foo);

// output
echo $dom->saveHTML($dom->documentElement);

次のような結果になります

<html><body>
    <p>Some content</p>
        <p>Some more content</p>
    </body></html>
于 2013-01-04T14:40:03.283 に答える
0

正規表現を使用してXML/HTMLを解析することはお勧めしません。代わりにDOMパーサーを使用してください。

于 2013-01-04T14:39:44.807 に答える