PHP正则表达式:用于表达式部分的无壳修饰符

时间:2015-02-24 21:16:05

标签: 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);

此global / i修饰符会导致罗马数字出现问题。我想删除它,但同时要抓住像"音量","音量"," vol"," VOL" ," Vol"。是否可以为此部分添加\ i修饰符:

(\bv|Volume|\bvol)

1 个答案:

答案 0 :(得分:3)

您可以像这样打开/关闭修改器:

(?i)subpattern(?-i)

注意:内联修饰符的操作仅限于最里面的组。因此((?i)toto)abcdtotoABCD不匹配。并且一个小组不会保护上级的修饰符:(?i)(toto)abcd匹配TOTOabcd

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

(?i:subpattern)

关闭相同:

(?-i:subpattern)

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

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

(?ix-m)

(?ix-ms:subpattern)

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