Intereting Posts
Ошибка при импорте файла excel в базу данных Класс «Memcached» не найден – (php 5.4.9, окна 7) Дата PHP, показывающая «1970-01-01» после преобразования Как установить файлы cookie в течение 20 минут и проверить, истек ли срок их действия xdegug не может перейти к следующей строке в представлении php вставлять данные из JSON в mysql, используя php Попытка проверить, существует ли имя пользователя в базе данных MySQL, используя PHP Ошибка анализа XML: объявление XML или текста не в начале объекта в php geo_point для поля местоположения в поле массива Иностранный ключ, не хранящийся в Yii Как сделать Symfony2 автозагрузкой моей routing.yml для моих пакетов, которые я создаю в папке поставщиков? Альтернатива для использования CURLOPT_SSL_VERIFYHOST, 2 Почему мой PHP-скрипт chmod не создает файл? Symfony2: как получить доступ к сервису из репозитория Почему PHP DOM не содержит косой черты на закрывающих тегах?

Диапазон кванторов не работает в lookbehind

Хорошо, поэтому я работаю над проектом, где мне нужно регулярное выражение, которое может совпадать с *, за которым следует 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