PHP 正则表达式 : caseless modifier for part of the expression

标签 php regex preg-match

我想知道在 PHP 中是否可以仅为表达式的一部分(而不是整个表达式)设置 regexp 修饰符。

我有以下代码:

    $romanDigitsRegexp="(M{1,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})|M{0,4}(CM|C?D|D?C{1,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})|M{0,4}(CM|CD|D?C{0,3})(XC|X?L|L?X{1,3})(IX|IV|V?I{0,3})|M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|I?V|V?I{1,3}))";

    $test = "Properties of Wide Bandgap li-vi Semiconductors VolUme1";

    $volumeInfoFound = preg_match("/(\bv|Volume|\bvol)[\.| ]*(\d+|".$romanDigitsRegexp.")\b/i",$test, $matches);

此全局/i 修饰符会导致罗马数字出现问题。我想删除它,但同时捕获诸如“volume”,“VOLUME”,“vol”,“VOL”,“Vol”之类的词。是否可以仅为此部分添加\i 修饰符:

(\bv|Volume|\bvol)

最佳答案

您可以像这样打开/关闭修饰符:

(?i)subpattern(?-i)

注意:内联修饰符的作用仅限于最里面的组。因此 ((?i)toto)abcdtotoABCD 不匹配。并且组不能防御上层修饰符:(?i)(toto)abcd 匹配 TOTOabcd

如果您想为非捕获组中包含的子模式打开修饰符,您也可以使用以下语法:

(?i:subpattern)

与关闭相同:

(?-i:subpattern)

注意:不幸的是你不能对原子组做同样的事情。 (您不能编写 (?i>subpattern))

对于这两种语法,您可以同时切换多个修饰符:

(?ix-m)

(?ix-ms:subpattern)

注意:不禁止写(?i-i),但它没有用。

关于PHP 正则表达式 : caseless modifier for part of the expression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28706443/

相关文章:

php - 使用 swiftmailer 密件抄送多个地址

php - 关于在 PHP 简单验证中使用正则表达式的问题

php - $_POST 未通过 AJAX 调用设置

regex - 如何使用“在文件中查找”在 Delphi 中执行 bool 'AND' 搜索?

css - 如何在 python3 中替换非标准标签的属性?

php - MySQL 使用 RegEx 更新/选择列

php - 通配符数组比较——提高效率

PHP 缓冲区输出缩小,不是 textarea/pre

php - 在if条件php中使用for循环计数器

php - 查找 "a"行是否与 ORM 中的 "b"行有关系的最有效方法?