1

这是我得到的:

<ol>
<li></li>
<li></li>
</ol>

<ul>
<li></li>
<li></li>
</ul>


if (preg_match("/<ol>.*(<li(|\s*\/)>).*<\/ol>/Ums", $text->Bodytext)) {
$cleanlist = preg_replace("/(<li(|\s*\/)>)/", "<li><tag>", $text->Bodytext);

如果页面仅包含 ol 标签,则此 php 代码运行良好,但如果由于某种原因它同时包含 ul 和 ol 标签,它也会更改 ul 标签内的 li 标签,我只希望它在 ol 标签内替换它。可能是什么问题,我该如何解决?

4

2 回答 2

0

您的正则表达式中的问题可能是贪婪。您应该附加一个问号,.*?以便它匹配较少的填充。

但是,如果您没有尝试使用单个正则表达式来完成它,它会更可靠。这总是比走简单的路线多一点:

$html = preg_replace_callback('#<ol>(.*?)</ol>#Us', "change_li", $html);
function change_li($m) {
    return preg_replace('#<li>#', '<li><tag>', $m[0]);
}

现在,在 meme 海报出现之前,使用正则表达式并不是最可靠的方法。除非你有古怪的 HTML,否则它在你的情况下是可行的。但是,另一种方法是使用phpQuery 或 QueryPath,其中匹配就像qp($html)->find("ol")->find("li"). 虽然实际的替换会更多地涉及这种方法。

于 2011-01-29T07:05:39.897 回答
0

在 PHP 5.3 中,这个任务可以按如下方式完成:

        $input = <<<END
<ol>
<li></li>
<li></li>
</ol>

<ul>
<li></li>
<li></li>
</ul>
END;



        $result = preg_replace_callback(
                "/(<ol>.*<\/ol>)/Ums",
                function ($ol) {
                    return preg_replace("/(<li(|\s*\/)>)/", "<li><tag>", $ol[1]);                    
                },
                $input
        );

        var_dump($result);

输出将是:

        string '<ol>
<li><tag></li>
<li><tag></li>
</ol>

<ul>
<li></li>
<li></li>
</ul>' (length=72)
于 2011-01-29T07:14:47.170 回答