php - 匹配包含 "XYZ"并且不以冒号开头的单词

标签 php regex utf-8

我正在寻找一个正则表达式模式,该模式与包含 XYZ 的任何单词相匹配,并且不以冒号 : 开头。

例如,我想仅从 This isXYZ a :exampleXYZa 匹配 isXYZ

我的第一个想法是使用这个正则表达式模式:

/(?<!\:[^\s\r\t\n])XYZ/

基本上,是一个负向后查找,以确保事先不存在没有空格的冒号。然而,这不起作用,因为 lookbehind assertion must be fixed length .

编辑:我也希望有 utf8 支持。

最佳答案

您可以使用如下所示的正则表达式:

/\b((?<!:)\w*XYZ\w*)\b/ui
  • \b before 和 after 只是匹配单词边界。

  • ((?<!:)\w*XYZ\w*) ,我们检查任何包含 XYZ 的单词其中,前面有零个或多个字符,后面有零个或多个字符。借助负向回顾(?<!:) ,我们确保它前面没有 : .

  • 正如 @unclexo 在评论中提到的,您可以添加 u末尾的修饰符支持 UTF-8 序列匹配。 See here for more info .

  • 您还可以添加 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

关于php - 匹配包含 "XYZ"并且不以冒号开头的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59906696/

相关文章:

php - FCGI 和 PHP 5.4.x 不加载 .user.ini

php - 缩短包含查询字符串的 URL

php:对给定字符串中的单词实例进行排序和计数

php - Laravel 自定义验证规则

regex - 如何找到用于分隔字符串的正则表达式

Java Spring UTF-8 在不同环境中失败

php - 使用php从数据库访问数据并将数据输出到HTML

python - 子匹配的位置

spring - GET 对我的表单和 UTF-8 的请求

JavaScript 正则表达式 UTF-8