2

我正在对我不一定控制的内容运行 preg_replace,并且遇到了包含货币值(即$1.00)之类的替换值的问题。诚然,这是一个常见问题,已在其他问题中得到解决。我找到的最接近的解决方案是:

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

我的问题更复杂,因为替换值不是我可以提前逃脱的东西,至少不是我能看到的方式。这是我的预置代码:

$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

不推荐使用 Regex 解析 XML/HTML。请改用DOM解析器。

于 2013-01-04T14:39:44.807 回答