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
可以解决此问题-或者看起来是这样-