PHP中使用preg_replace移除字符串中所有FONT标签的问题
解决PHP中清除所有FONT标签的正则问题
你遇到的问题根源在于正则表达式的贪婪匹配特性!咱们一步步拆解下为啥原代码会得到不符合预期的结果:
你的原正则是/\[FONT=(.*)\](.*)/,这里的(.*)是贪婪模式,它会尽可能匹配最长的字符串。第一个(.*)会直接“吞掉”从第一个[FONT=到整个字符串里最后一个]之间的所有内容——也就是arial]Dit is een tekst [FONT=Courier New这一大段,剩下的第二个(.*)自然就只有nonononon了,所以替换后只留下了这部分。
要搞定这个问题,咱们需要做两个关键调整:
- 让正则能精准匹配单个
[FONT=...]标签,而不是一次性匹配到最后一个标签 - 开启全局替换,确保所有FONT标签都被清除
下面给你两种简洁可靠的解决方案:
方案一:使用非贪婪匹配
把正则里的.*改成.*?(非贪婪模式),它会匹配到第一个]就停止,再加上全局修饰符/g,就能逐个清除所有FONT标签:
$old = '[FONT=arial]Dit is een tekst [FONT=Courier New]nonononon'; $new = preg_replace('/\[FONT=(.*?)\]/', '', $old); echo "\nold = $old\nnew = $new\n";
方案二:用字符集限定匹配范围(更高效)
直接匹配]之外的字符,避免正则回溯,性能更优,同样加上全局替换:
$old = '[FONT=arial]Dit is een tekst [FONT=Courier New]nonononon'; $new = preg_replace('/\[FONT=[^\]]+\]/', '', $old); echo "\nold = $old\nnew = $new\n";
运行任意一种代码,都会得到你期望的结果:
old = [FONT=arial]Dit is een tekst [FONT=Courier New]nonononon new = Dit is een tekst nonononon
内容的提问来源于stack exchange,提问作者Bas van den Dikkenberg
相关产品推荐
相关产品推荐

