我正在寻找与包含XYZ
但不以冒号开头的任何单词匹配的正则表达式模式:
。
例如,我想从匹配This isXYZ a :exampleXYZa
只isXYZ
。
我的第一个想法是使用此正则表达式模式:
/(?<!\:[^\s\r\t\n])XYZ/
基本上,向后看是负面的,以确保事先没有空白就不会冒号。但是,这不起作用,因为后置断言必须为固定长度。
编辑:我也想获得utf8支持。
您可以使用如下所示的正则表达式:
/\b((?<!:)\w*XYZ\w*)\b/ui
\b
之前和之后是为了匹配单词边界。
在中((?<!:)\w*XYZ\w*)
,我们检查其中是否有任何单词,XYZ
且其前面有零个或多个字符,其后有零个或多个字符。借助负向后看(?<!:)
,我们确保它的前面没有:
。
如@unclexo在评论中所提到的,您可以u
在末尾添加修饰符以支持UTF-8序列匹配。有关更多信息,请参见此处。
您也可以添加i
不区分大小写匹配的标志。
片段:
<?php
$tests = [
'This isXYZ a :exampleXYZa',
'isXYZ a :exampleXYZa abcXYZ',
'isXYZ a :exampleXYZXYZa abcXYZ',
'XYZ',
'XYZjdhf',
'This isXYZ a example:XYZa',
'äöüéèXYZ :äöüéèXYZäöüéè'
];
foreach($tests as $test){
if(preg_match_all('/\b((?<!:)\w*XYZ\w*)\b/ui',$test,$matches)){
print_r($matches[0]);
}
}
演示: https ://3v4l.org/Y8SMj
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句