может ли это регулярное выражение найти / заменить быть оптимизированным? - PullRequest
1 голос
/ 12 июня 2009

очень просто, я написал регулярное выражение для поиска и замены тегов на php-константы из фрагмента html. мое решение, которое работает, просто не чувствуется правильным. как это можно улучшить?

preg_match_all('/\{CONSTANT_(.*)\}/', $final, $result, PREG_PATTERN_ORDER);
            for ($i = 0; $i < count($result[1]); $i++) {
               $final = str_replace($result[0][$i], constant($result[1][$i]),$final);
            }

Ответы [ 4 ]

1 голос
/ 12 июня 2009

Вы можете сделать все это одним ударом с помощью preg_replace_callback

function getConstant($matches) 
{
    return constant($matches[1]);
}
$final=preg_replace_callback(
           '/\{CONSTANT_(.*?)\}/',
           "getConstant",
           $final);

Заметьте, я сделал .* не жадным с .*?, это даст эффект того, что он не съест}, если возможно более длинное совпадение. Вы можете получить тот же эффект с ([^}]*), или еще лучше, ([a-zA-Z0-9_]+)

0 голосов
/ 12 июня 2009

А как же

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit= -1 [, int &$count ]] )

0 голосов
/ 12 июня 2009

Будьте осторожны с использованием ".*" в регулярном выражении, так как оно будет жадно соответствовать всему, что находит. Например, в следующей строке:

{CONSTANT_ONE} blah {CONSTANT_TWO}

Приведенное выше регулярное выражение будет захватывать строку "ONE} blah {CONSTANT_TWO"

Вы можете использовать класс символов вместо. соответствовать чему-либо, кроме символа "}":

/\{CONSTANT_([^}]*)\}/
0 голосов
/ 12 июня 2009

Я всегда против повторного изобретения колеса: если вам нужен какой-то шаблонизатор (который уже есть php), взгляните на Smarty .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...