Php regexp在条件中重写

Php regexp在条件中重写,php,regex,Php,Regex,我需要有人能帮我使用regxp。 我解释我的问题 在ckeditor中的一段之后,我的文本如下: lorem ipsum #12345, this is a <span style="color: #111111">colored text</span> $CommentText = 'lorem ipsum #12345, this is a <span style="color: #12345">colored text</span>';

我需要有人能帮我使用regxp。 我解释我的问题

在ckeditor中的一段之后,我的文本如下:

 lorem ipsum #12345, this is a <span style="color: #111111">colored text</span>
$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";


我知道

$text=preg#u replace('/#([0-9]+)/',''$CommentText);
但使用这种方法时,色码#111111也会改变

你能帮我写一个正确的regexp来解决我的问题吗(总是改变#1212,但如果这段代码是在一个style属性中的话就不行了)


非常感谢您的帮助

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

正如您已经充分解释的那样,CSS样式可能包含十六进制颜色模式(而且不仅仅是
color

使用正则表达式最接近您的问题的解决方案是负lookbehinds,但PCRE不支持任意长度的lookbehinds(只有.NET语言支持)。即使它支持,您也必须设计一个正则表达式来匹配所有可能的情况


不要这样做。使用HTML解析器,将您的正则表达式(非常有效)仅与文本内容匹配。

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

正如您已经充分解释的那样,CSS样式可能包含十六进制颜色模式(而且不仅仅是
color

使用正则表达式最接近您的问题的解决方案是负lookbehinds,但PCRE不支持任意长度的lookbehinds(只有.NET语言支持)。即使它支持,您也必须设计一个正则表达式来匹配所有可能的情况


不要这样做。使用HTML解析器,将您的正则表达式(基本上可以工作)与文本内容进行匹配。

您可以尝试以下基于条件子模式的正则表达式代码:

 lorem ipsum #12345, this is a <span style="color: #111111">colored text</span>
$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";
$CommentText='lorem ipsum#12345,这是一个彩色文本';
$r=“~#(12345)。*?(]*>)~i”;
$s=预替换($r,$2,$CommentText);
回显“$s\n”;
输出:

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

您可以尝试以下基于条件子模式的正则表达式代码:

 lorem ipsum #12345, this is a <span style="color: #111111">colored text</span>
$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";
$CommentText='lorem ipsum#12345,这是一个彩色文本';
$r=“~#(12345)。*?(]*>)~i”;
$s=预替换($r,$2,$CommentText);
回显“$s\n”;
输出:

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

您要替换的数字是否超出了固定长度?这种方法似乎可行,但不太美观;)
$text2=preg_replace('/([^:]])#([0-9]+)/','$1',$text)我是完全错了还是这个解决方案看起来像是对的?Thanksit应该有效是的,前提是您的CSS始终在:和#之间有一个空格。是的,您是对的,这是因为我发现我的解决方案不太漂亮。您要替换的数字是否超出了固定长度?这种方法似乎有效,但不太漂亮;)<代码>$text2=preg_replace('/([^:]])#([0-9]+)/','$1',$text)我是完全错了还是这个解决方案看起来像是对的?Thanksit应该可以工作是的,前提是你的CSS总是在:和#之间有一个空格。是的,你是对的,那是因为我发现我的解决方案不是很漂亮。嗯,我没有考虑过这个解决方案。谢谢我会看看这个解决方案。也许对我来说最好,是的。在谷歌上看了一眼后,我发现这个:。我会尝试的。我已经修改了我的代码(带有id的remplace#),并学习了负面lookbehinds的用法(在id1234之后不存在时替换):非常有效。谢谢,这是一个我没想到的解决办法。谢谢我会看看这个解决方案。也许对我来说最好,是的。在谷歌上看了一眼后,我发现这个:。我会尝试的。我已经修改了我的代码(带有id的remplace#),并学习了负面lookbehinds的用法(在id1234之后不存在时替换):非常有效。感谢条件子模式参考:非常感谢您的回复。我将在明天(今天没有更多时间)尝试条件子模式引用:非常感谢您的回复。我明天试试(今天没有时间了)