【问题标题】:regex - match not in tag [duplicate]正则表达式 - 标签中不匹配 [重复]
【发布时间】:2009-12-02 20:43:47
【问题描述】:

这应该很容易,但不知何故我想不通: 我有这样的 HTML sn-p: <p style="padding:0 10 20 30; margin: 1 2 3 4 ">This is 201 some 20 text 1 <b>30</b> with some numbers 30 20</p> ...

我需要匹配数字 1、20、30(仅限那些)并用链接替换它们。 显然我不想替换标签内的数字

输出应该是: <p style="padding:0 10 20 30; margin: 1 2 3 4 ">This is 201 some <a href="#20">20</a> text <a href="#1">1</a> <b><a href="#30">30</a></b> with some numbers <a href="#30">30</a> <a href="#20">20</a></p> ...

这就是我所拥有的:

$text = '<p style="padding:0 10 20 30; margin: 1 2 3 4 ">This is 201 some 20 text 1 <b>30</b> with some numbers 30 20</p> ...';

$pat[]  = '/(?<=\>)([^<]*)([^0-9\:])(1|20|30)([^0-9])/s';
$repl[] = '$1$2<a href="#$3" class="p2">$3</a>$4';
echo preg_replace($pat, $repl, $text);

它有效,但一次只匹配一个数字,我不想循环运行它。

有什么想法吗?

--

我看到了使用 HTML 解析器的意义,但它似乎可以使用正则表达式来完成。尤其是当 PHP 中没有用于解析 HTML 的标准库时,我不确定是否要为此任务导入第三方 HTML 解析器。 任何尝试修复我的正则表达式?

-- 我设法编写了适用于我的正则表达式。如果有人有兴趣:

$pat[] = '/>(([^<]*)(([^0-9\:]))|())(1|20|30)(?(?=[<]+?)(?!<\/a>)|(([^0-9\<])([^<]*)<(?!\/a>)))/sU'; $repl[] = '>$1<a href="#$6" class="p22">$6</a>$7';

我很清楚它可以通过 HTML 解析器轻松完成,但我不想在我的软件中包含第三方解析器。

问候, 菲利亚

【问题讨论】:

    标签: php html regex


    【解决方案1】:

    非常简单:使用 HTML 解析器仅提取文本,然后对其使用正则表达式。

    【讨论】:

      【解决方案2】:

      正则表达式用于解析regular languages - 可以用有限自动机描述的那些。 HTML 不是常规语言。用正则表达式解析 HTML 是邪神之道:Parsing Html The Cthulhu Way

      【讨论】:

        【解决方案3】:

        不应使用正则表达式解析 HTML,因为它不是常规语言。您也许可以这样做以正确地形成 XHTML,但我不推荐它。见the most voted up answer on SO

        【讨论】:

          猜你喜欢
          • 2012-10-31
          • 2012-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-20
          相关资源
          最近更新 更多