2015-02-24 2 views
2

Мне интересно, возможно ли в PHP установить модификатор regexp только для части выражения (не для всего выражения).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); 

Эти глобальные/я модификатор вызывает проблемы с римскими цифрами. Я хотел бы удалить его, но в то же время поймать такие слова, как «объем», «VOLUME», «vol», «VOL», «Vol». Можно ли добавить \ я модификатор только для этой части:

(\bv|Volume|\bvol) 

ответ

3

Вы можете включить/выключить модификаторы, как это:

(?i)subpattern(?-i) 

Примечание: действие модификатора инлайн ограничивается сокровенным группа. Так что ((?i)toto)abcd не соответствует totoABCD. И группа не защищает от модификатора верхнего уровня: (?i)(toto)abcd соответствует TOTOabcd.

если вы хотите включить модификатор для подмаски, заключенной в не-захвата группы, которую вы можете использовать этот синтаксис также:

(?i:subpattern) 

То же самое, чтобы выключить:

(?-i:subpattern) 

Примечание : к сожалению, вы не можете сделать то же самое с атомной группой. (Вы не можете написать (?i>subpattern))

Для двух синтаксисов вы можете переключиться несколько модификаторов в то же время:

(?ix-m) 

(?ix-ms:subpattern) 

Примечание: это не запрещено писать (?i-i), но это бесполезно.

+0

Спасибо, это работает. – Tamara

Смежные вопросы