【发布时间】:2016-09-13 19:27:02
【问题描述】:
我试图搜索这个问题的答案一段时间,但找不到。有许多与匹配文本相关的帖子,这些帖子前面没有某些文本,但似乎没有一个适用于这种情况下 + 匹配但只有在单个 + 前面才允许(例如 ++)
我正在尝试从文本中删除标点符号,但让两个连续的 ++ 符号保留,但单个 + 符号消失
$text="Hello World! C+ C++ C#";
print_r(preg_replace('/(?!\+\+)[[:punct:]]/', ' ', $text));
导致(我不确定为什么后面的 + 被删除了?有人可以解释一下吗?):
Hello World C C+ C
如果我尝试:
$text="Hello World! C+ C++ C#";
print_r(preg_replace('/(?!\+)[[:punct:]]/', ' ', $text));
结果是:
Hello World C+ C++ C
但我想要的结果是:
Hello World C C++ C
谢谢
更新:我意识到我可能应该提到我将有其他我想避免的角色。我可能把这个问题简单化了。例如,我可能想避免 # 也因此结果是
Hello World C C++ C#
解决方案应该易于扩展。对于此信息缺失给您带来的不便,我们深表歉意。
【问题讨论】:
-
问题来自像
++++这样的场景。那该怎么办呢? -
然后只在
(*SKIP)(*F)-preg_replace('/(?:[#^]|\*{3}|\+{2})(*SKIP)(*F)|[[:punct:]]+/', ' ', $text);之前枚举非捕获组内的特殊情况 -
preg_replace('\b(\+(?!\+)|[^\P{P}#])', ' ', $text)你必须在字符类中添加特殊字符。例如。排除!:[^\P{P}#!]
标签: php regex pcre negative-lookbehind