Preg_match从文本中排除单词

时间:2013-11-14 14:14:59

标签: php regex preg-match

我有字符串:

  

FirstWord word2 word3 wrongWord word4 lastWord

希望选择以FirstWord开头的字符串,以lastWord结尾且不包含wrongWord

我是第一个也是最后一个:

  

/ firstword(。*?)lastword / i

但排除wrongword不起作用。

尝试:

  

/ firstword(^ wrongWord *?)lastword / i

     

/ firstword ^((?!wrongWord)。)* lastword / i

更像这样,但没有任何作用。

4 个答案:

答案 0 :(得分:8)

以下是什么问题?

/^firstword ((?:(?!wrongword).)+) lastword$/i

请参阅live demo

正则表达式:

^              the beginning of the string
 firstword     'firstword '
 (             group and capture to \1:
  (?:          group, but do not capture (1 or more times)
   (?!         look ahead to see if there is not:
    wrongword  'wrongword'
   )           end of look-ahead
   .           any character except \n
  )+           end of grouping
 )             end of \1
 lastword      ' lastword'
$              before an optional \n, and the end of the string

答案 1 :(得分:2)

你可以使用这个技巧:

/^firstword ((?:[^w]+?|\Bw|w(?!rongword\b))*?) lastword$/i

或更高效:

/^firstword ((?>[^w\s]++|\s(?!lastword$)|\Bw|w(?!rongword\b))*+) lastword$/i

答案 2 :(得分:2)

请参阅this example

使用的正则表达式是

/firstword((?!wrongword).)*lastword/i

答案 3 :(得分:1)

如果禁用词恰好是较长词的一部分怎么办?例如,如果您希望字符串以“first”开头并以“last”结尾但不包含单词“word”,该怎么办?例如:

"first one two word last"              # don't match
"first three wordplay four last"       # OK
"first five swordfish six seven last"  # OK

调整接受的答案会给你:

/^first (?:(?!word).)+ last$/i

...但是这会拒绝所有三个字符串。无论如何,无需在每个位置执行前瞻。只需在每个单词的开头处执行一次:

/^first(?:\s+(?!word\b)\w+)*\s+last$/i

请参阅live demo