Php 匹配';感叹号';字符';前面没有一个单词';

Php 匹配';感叹号';字符';前面没有一个单词';,php,regex,Php,Regex,我想删除所有字符串中的字符,该字符串前面不紧跟单词。为了完成这项任务,我考虑使用preg_replace()执行正则表达式匹配 也就是说,我想要以下对文本的亵渎: search! query ! !key!words that! acc!ept exclamation! marks! 。。。成为: search! query keywords that! accept exclamation! marks! 没有必要考虑双重+事件,因为我使用(![!]+)过滤掉它们-尽管如果有人知道一个考虑

我想删除所有
字符串中的字符,该字符串前面不紧跟单词。为了完成这项任务,我考虑使用
preg_replace()
执行正则表达式匹配

也就是说,我想要以下对文本的亵渎:

search! query ! !key!words that! acc!ept exclamation! marks!
。。。成为:

search! query keywords that! accept exclamation! marks!
没有必要考虑双重+事件,因为我使用
(![!]+)
过滤掉它们-尽管如果有人知道一个考虑双重+事件的解决方案,我非常乐意欢迎它,因为它消除了额外查找的需要

到目前为止,我已经有了
(!\b)|(\s+!\s+)(!\s+)
,它除了在我看来有点古怪之外,工作几乎完美,但有时会删除单词之间的间距,产生

search! querykeywords that! accept exclamation! marks!

编辑

解析字符串时,我需要考虑重音字符和/或大写字符。

([^a-z])\!+\124;\+([a-z])
,替换为
$1$2
应匹配多个!”前面没有字母(\W)或后面紧跟字母(\W)的


如果您的正则表达式语言采用正向lookaheads/lookbehinds,那么您可以在需要时使用
(?您想要删除

  • 前面没有分词符(如
    foo!
  • 或者后面有一个断字(如
    !foo
这就产生了:

\B!|!\b

我还没有测试这个服务器端,但是根据,这将产生
搜索查询词!acpt惊叹!marks!
。RegExr使用JavaScript处理正则表达式,但PHP和JavaScript不是都基于Perl正则表达式吗?@JánosWeisz我将原来的替换字符串改为
$1$2
,并添加了一个替代项。t第二个非常接近目标,但它不是一个空格,而是将
查询
关键字
合并在一起,产生了与问题中相同的结果。我想没有一个单行正则表达式解决方案来决定使用
空格
还是不使用,对吗?这个解决方案的另一个问题是-和忘记在问题中说明的,现在更正-是字符串中可以有重音字符和/或大写字符。很好,很清楚。对于任何想知道的人来说,如果以后出现
字符,这将无法无缝工作(这不是一个问题,正如我之前在原始问题中所述)。但是,将其更改为
\B!+|!+\B
可以解决此问题-或者看起来是这样-