Хорошо, поэтому я работаю над проектом, где мне нужно регулярное выражение, которое может совпадать с *, за которым следует 1-4 пробела или вкладки, а затем строка строк. Сейчас я использую. * После поиска в целях тестирования. Однако я могу получить его, чтобы явно соответствовать 1, 2 или 4 пробелам / вкладкам, но не 1-4. Я тестирую следующий блок
* test line here * Second test * Third test * Another test
И это два шаблона, которые я тестирую (?<=(\*[ \t]{3})).*
Который работает так, как ожидалось, и соответствует второй строке, то же самое, если я заменю 3 на 1, 2 или 4 однако, если я заменил его на 1,4, образуя следующий шаблон (?<=(\*[ \t]{1,4})).*
он больше не соответствует ни одной из строк, и я, честно говоря, не могу понять, почему. Я пробовал поиски в Интернете без успеха. Я использую флаг g (lobal).
PHP, как и многие другие варианты, не поддерживает переменную длину lookbehind. Единственная поддержка – чередование ( |
) на верхнем уровне lookbehind. Даже ?
может нарушить шаблон. Альтернативой является использование:
(?<=\*[ \t]|\*[ \t]{2}|\*[ \t]{3}|\*[ \t]{4}).*
Или лучше, прервите lookbehind для группы:
\*[ \t]{1,4}(.*)
Это должно хорошо работать для вас, так как, похоже, у вас нет совпадений в ваших матчах.
Из руководства:
Содержимое утверждения lookbehind ограничено таким, что все строки, которые он соответствует, должны иметь фиксированную длину. Однако, если есть несколько альтернатив, они не все должны иметь одну и ту же фиксированную длину. Таким образом (? <= Bullok | donkey) разрешено, но (? <! Dogs? | Cats?) Вызывает ошибку во время компиляции. Филиалы, которые соответствуют строкам различной длины, разрешены только на верхнем уровне утверждения lookbehind.
Источник: http://www.php.net/manual/en/regexp.reference.assertions.php