正则表达式 - 不匹配标记

时间:2009-12-02 20:43:48

标签: php html regex

这应该很容易但不知何故我无法弄清楚: 我有像这样的HTML代码段: <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解析器的重点,但似乎可以用regexp完成。特别是当没有用于在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解析器可以轻松完成,但我不想在我的软件中包含第三方解析器。

此致 嗜

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

这很简单:只使用HTML解析器提取文本,然后在其上使用正则表达式。

答案 2 :(得分:0)

HTML不应该使用正则表达式进行解析,因为它不是常规语言。你可能能够正确地形成XHTML,但我不推荐它。见the most voted up answer on SO