为了账号安全,请及时绑定邮箱和手机立即绑定

包含“XYZ”且不以冒号开头的匹配词

包含“XYZ”且不以冒号开头的匹配词

PHP
BIG阳 2022-08-19 10:19:50
我正在寻找一个正则表达式模式,该模式匹配任何包含且不以冒号开头的单词。XYZ:例如,我只想从 匹配 。This isXYZ a :exampleXYZaisXYZ我的第一个想法是使用这个正则表达式模式:/(?<!\:[^\s\r\t\n])XYZ/基本上,负面的查看会确保事先没有空格就没有冒号。但是,这不起作用,因为 lookbehind 断言必须是固定长度。编辑:我也想得到utf8的支持。
查看完整描述

1 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

你可以有一个正则表达式,如下所示:

/\b((?<!:)\w*XYZ\w*)\b/ui
  • \b前后只是匹配一个单词边界。

  • 在 中,我们检查其中是否有任何单词,并且它前面有零个或多个字符,后面有零个或多个字符。在负向隐藏的帮助下,我们确保它前面没有。((?<!:)\w*XYZ\w*)XYZ(?<!:):

  • 正如@unclexo在注释中提到的,您可以在末尾添加修饰符以支持 UTF-8 序列匹配。有关详细信息,请参阅此处u

  • 您还可以添加不区分大小写匹配的标志。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


查看完整回答
反对 回复 2022-08-19
  • 1 回答
  • 0 关注
  • 98 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信