Я пытаюсь сделать регулярное выражение PHP, но я не могу найти правильный путь …
Представьте, что у меня есть эта строка: «Привет, мой {{имя – Питер]} и {{я хочу есть шоколад}}"
Я хочу взять части между {{и}}
Но если я использую preg_match("/\{\{(.*)?\}\}/", $string)
он возвращает мне одну строку «{{name is Peter}} и {{я хочу есть шоколад}}"
Как я могу сказать, чтобы первые совпадения}}?
спасибо
использование
"/{{(.*?)}}/"
Выражение ".*"
Является жадным, принимая как можно больше символов. Если вы используете ".*?"
занимает как можно меньше символов, то есть останавливается в первом наборе закрывающих скобок.
PCRE по умолчанию действует жадно. Это означает, что двигатель всегда пытается сопоставить как можно больше символов. Решение прост: просто скажите ему, чтобы он не жадный с модификатором U
/{{(.+)}}/U
Вы хотите «ungreedy matching»: preg_match("/{{(.*?)?}}/", $string)
.
Обратите внимание на первый вопросительный знак – регулярное выражение по умолчанию является «жадным»: если задано несколько способов совпадения, оно соответствует как можно большему количеству текста. Добавление вопросительного знака сделает его неровным, поэтому, если есть несколько способов совпадения, оно будет соответствовать как можно меньше символов.
РЕДАКТИРОВАНИЕ
Поскольку нежелательное сопоставление, кажется, быстрее, чем отрицание ( см. Здесь ), я тоже меняю свой ответ. Думал, что это было наоборот …
preg_match("/\{\{(.*?)\}\}/", $string)
Вы можете использовать preg_match_all
для получения всех совпадений