regexp重写条件

时间:2012-01-13 12:37:39

标签: php regex

我需要一个可以帮助我进行regxp的人。 我解释了我的问题。

在ckeditor中传阅后,我的文字是这样的:

 lorem ipsum #12345, this is a <span style="color: #111111">colored text</span>

我想重写此文本以进行转换

 #1234 

<a href="/php/design/text.php?occ=1234">#1234</a>

我做

$text = preg_replace('/#([0-9]+)/', '<a href="/php/design/text.php?occ=$1">#$1</a>', $CommentText);

但是这个方法的颜色代码#111111也改变了。

你能帮我写一个正确的正则表达式来解决我的问题(总是改变#1212但是如果这个代码是在一个样式属性中则不行。

非常感谢你的帮助

2 个答案:

答案 0 :(得分:1)

你不能用PHP正则表达式做到这一点。您必须使用HTML解析器来提取HTML文档的文本并对其进行操作。

正如您已经充分解释的那样,您遇到的问题是CSS样式可以包含十六进制颜色模式(不仅仅是color)。

使用正则表达式解决问题的最接近的解决方案是负面的后视,但PCRE不支持任意长度的外观(只有.NET语言)。即使它确实如此,你也必须设计一个正则表达式以匹配所有可能的情况。

不要那样做。使用HTML解析器并将您的正则表达式(几乎可以使用)与文本内容匹配。

答案 1 :(得分:0)

你可以尝试这样的基于条件子模式的正则表达式代码:

$CommentText = 'lorem ipsum #12345, this is a <span style="color: #12345">colored text</span>';
$r = "~#(12345).*?((<)(?(3)[^>]*>))~i";
$s = preg_replace($r, "<a href='/php/design/text.php?occ=$1'>#$1</a>$2", $CommentText);
echo "$s\n";

<强>输出:

lorem ipsum <a href='/php/design/text.php?occ=12345'>#12345</a><span style="color: #12345">colored text</span>