2009-12-02 53 views
0

这应该是容易的,但不知何故,我无法弄清楚: 我有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解析器的地步,但它看起来似乎可以用正则表达式来完成。特别是当没有用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解析器很容易实现,但我并不想在我的软件第三方解析器。

问候, Philia酒店

回答

1

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