Intereting Posts
Создать изображение предварительного просмотра из видеофайла? Что случилось с этим назначением json-объекта с php на javascript? Что случилось с моей контактной формой AJAX? (php mail ()) Как я могу делить запятые и периоды из строки? Добавьте «.active» класс к ссылке текущей страницы в меню с помощью jQuery или PHP Невозможно сбросить запрос, чтобы показать сообщение ramdom после первого цикла WordPress Ошибка PHP Parse: синтаксическая ошибка, неожиданный T_ENCAPSED_AND_WHITESPACE, ожидающий T_STRING или T_VARIABLE или T_NUM_STRING : вызывать файл PHP через код JavaScript с аргументом Многократные разделители Php в разрыве PHP – Тип содержимого, не заданный приложением / x-www-form-urlencoded Соединение SQL в CodeIgniter с активной записью Ошибка при отправке файла формы с помощью формы с помощью AJAX как извлечь данные из mysql, содержащие специальные символы? PHP – Как создать динамические URL-адреса? Получите идентификатор определенного URL-адреса: post

Регулярное выражение для шаблонов слишком сильно захватывает

С помощью PHP я пытаюсь получить свое регулярное выражение для соответствия приведенным ниже ссылкам шаблонов. Проблема в том, что он также захватывает </ul> из первого блока текста. Когда я удаляю флаг /s , он получает только вторую ссылку. Что я делаю неправильно?

 /{{\%USERS}}(.*)?{{\%\/USERS}}/s 

Вот моя строка.

 <ul class="users"> {{%USERS}} <li>{%}</li> {{%/USERS}} </ul> {{%USERS}} hello?!{{%/USERS}} 

Почему мое выражение слишком много ловит или слишком мало?

Почему мое выражение слишком много ловит или слишком мало?

  1. Его ловить слишком много, потому что кванторы являются жадными по умолчанию (см. Li-aung Yip answer +1 для этого)

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

См. Не жадный ответ

 {{\%USERS}}(.*?){{\%\/USERS}} 

здесь, в Regexr , хорошее место для проверки регулярных выражений.

Btw. Я удалил ? после группы захвата, ее не нужно, так как * соответствует также пустой строке, поэтому нет необходимости делать ее дополнительно необязательной.

Вероятно, вам нужно использовать неживые кванторы.

* и + являются «жадными». Они будут соответствовать как можно большему количеству символов.

*? и +? являются «неживыми». Они будут соответствовать только нескольким символам, необходимым для перехода к следующей части регулярного выражения.

Итак, в следующей тестовой строке:

 <alpha><bravo> 
  • <.+> будет захватывать <alpha><bravo> (потому что . matches >< также!).
  • <.+?> будет захватывать <alpha> .

Вот ваше регулярное выражение:

 /{{%USERS}}([^{]+({%[^{]+)?){{%/USERS}}/g