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); 

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

Кто-нибудь может, пожалуйста, помочь?

Спасибо:)

Author: RacerNerd, 2010-12-08

3 answers

Сделайте свои матчи нежадными.

Изменение

.+

До

.+?

Это работает!!

Объяснение:

Квантор + по умолчанию является жадным.

Рассмотрим регулярное выражение \[(.+)\], которое пытается сопоставить и охватить все между [ и ]. На входе [foo] он работает нормально и foo записывается. Но на входе [foo] and [bar] он захватит foo] and [bar!!! Это жадное поведение в действии что заставляет + потреблять столько, сколько он может. Делая соответствие нежадным \[(.+?)\], мы говорим + потреблять как можно меньше, но все еще пытаемся соответствовать. Так что в этом случае с тем же вводом он будет захватывать foo.

Несколько советов:

В вашем регулярном выражении нет реальной необходимости в 1-й и 3-й группах: '/(\' \. \$)(.+)( \. \')/'. Таким образом, вы можете отбросить 1-ю и 3-ю пару (...). Если вы просто хотите сгруппировать, используйте (?:..), а не (..), который используется для группировки + захвата.

В использование \\n в заменяемой детали не рекомендуется. Его следует использовать только в качестве обратной ссылки в регулярном выражении. Для использования групп захвата в заменяемой детали используйте $n.

Программа с вышеуказанными изменениями

 5
Author: codaddict, 2010-12-08 05:09:46

Я нашел этот инструмент чрезвычайно полезным при изучении регулярных выражений.

 1
Author: Zaven Nahapetyan, 2010-12-08 05:03:55

Вот один из них:

preg_replace("/context\['([^\']+)'\]/", "context[$1]", "context['bob']");

Вместо того, чтобы использовать не жадное совпадение, мы просто ищем все, что не является кавычкой.

И другой:

preg_replace("/' . [$]([^ ]+) . '/", '{$1}', '\' . $foo . \'');

Этот немного сложнее. Мы должны поместить $ в набор, чтобы он не рассматривался как символ конца строки. И {$1} должен быть в одинарных кавычках, чтобы PHP не интерпретировал его + фигурные скобки как переменную.

 0
Author: Paul Schreiber, 2010-12-08 04:59:28