使用 preg match 和 Replace 来替换 ol 标签中的 li 标签

发布于 2024-10-14 14:26:12 字数 483 浏览 8 评论 0原文

这是我得到的:

<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 标签内替换它。可能是什么问题以及如何解决它?

Here is what i got:

<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);

This php code works well if the page only contains ol tags, but if it contains both ul and ol tags for some reason it changes li tags inside ul tags too and I only want it to replace it within ol tags. What could be the problem and how can i fix it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

沫离伤花 2024-10-21 14:26:12

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

然而,如果您没有尝试使用单个正则表达式来完成它,那么它会更可靠。这总是比走简单的路线更复杂一些:

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

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

The problem in your regex is likely the greedyness. You should append a question mark to .*? so it matches less padding.

It would however be more reliable it you didn't try to accomplish it with a single regex. That's always a bit more involving then going the simple route:

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

Now before the meme posters come around, using regular expressions is not the most reliable approach. It's workable in your case unless you have wacky HTML. An alternative would be to use phpQuery or QueryPath however, where matching is as simple as qp($html)->find("ol")->find("li"). Though the actual replacing would be more involving with that approach.

尾戒 2024-10-21 14:26:12

在 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)

In PHP 5.3 this task could be done as follows:

        $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);

The output would be:

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

<ul>
<li></li>
<li></li>
</ul>' (length=72)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文