PHP - Регулярное выражение для удаления кавычек и добавления фигурных скобок?
Что ж, мне неприятно это признавать, но мне трудно работать с регулярными выражениями, я никогда не мог найти приличный учебник о том, как следует настраивать выражения.
Итак, скажем, у меня есть что-то вроде этого
context['something']
И я хочу изменить все вхождения на
context[something]
Тогда у меня есть
' . $var . '
И я хочу изменить все вхождения на
{var}
Это текущая концепция, но у меня возникли проблемы с частью регулярного выражения. Я использую str_replace, но с изменениями языка я не думаю, что это было бы достаточно стабильно таким образом.
Вот моя попытка.
$codes = array (
'/(\' \. \$)(.+)( \. \')/',
'/(\[\')(.+)(\'\])/'
);
$html = array (
'{\\2}',
'[\\2]',
);
$data = preg_replace($codes, $html, $data);
Это работает до тех пор, пока вы не соберете их все в файл, а затем все испортится.
Это текущая настройка
// these are temp need a better replace system
$data = str_replace("' . $", "{", $data);
$data = str_replace(" . '", "}", $data);
$data = str_replace("<?php", "", $data);
$data = str_replace("?>", "", $data);
$data = str_replace('context[\'forum_name\']', 'context[forum_name]', $data);
Просто нужен правильный способ прокомментировать их, чтобы они могли быть преобразованы позже во время сохранения.
Кто-нибудь может, пожалуйста, помочь?
Спасибо:)
3 answers
Сделайте свои матчи нежадными.
Изменение
.+
До
.+?
Это работает!!
Объяснение:
Квантор +
по умолчанию является жадным.
Рассмотрим регулярное выражение \[(.+)\]
, которое пытается сопоставить и охватить все между [
и ]
. На входе [foo]
он работает нормально и foo
записывается. Но на входе [foo] and [bar]
он захватит foo] and [bar
!!! Это жадное поведение в действии что заставляет +
потреблять столько, сколько он может. Делая соответствие нежадным \[(.+?)\]
, мы говорим +
потреблять как можно меньше, но все еще пытаемся соответствовать. Так что в этом случае с тем же вводом он будет захватывать foo
.
Несколько советов:
В вашем регулярном выражении нет реальной необходимости в 1-й и 3-й группах: '/(\' \. \$)(.+)( \. \')/'
. Таким образом, вы можете отбросить 1-ю и 3-ю пару (...)
. Если вы просто хотите сгруппировать, используйте (?:..)
, а не (..)
, который используется для группировки + захвата.
В использование \\n
в заменяемой детали не рекомендуется. Его следует использовать только в качестве обратной ссылки в регулярном выражении. Для использования групп захвата в заменяемой детали используйте $n
.
Я нашел этот инструмент чрезвычайно полезным при изучении регулярных выражений.
Вот один из них:
preg_replace("/context\['([^\']+)'\]/", "context[$1]", "context['bob']");
Вместо того, чтобы использовать не жадное совпадение, мы просто ищем все, что не является кавычкой.
И другой:
preg_replace("/' . [$]([^ ]+) . '/", '{$1}', '\' . $foo . \'');
Этот немного сложнее. Мы должны поместить $ в набор, чтобы он не рассматривался как символ конца строки. И {$1} должен быть в одинарных кавычках, чтобы PHP не интерпретировал его + фигурные скобки как переменную.