Не совсем уверен, что вы пытаетесь здесь, но если бы я сделал регулярное выражение, соответствующее списку слов (или именам функций в зависимости от обстоятельств), я бы сделал что-то вроде
// add/remove allowed stuff here
$allowed = array( 'nl2br', 'substr', 'addslashes' );
// make the array into a branching pattern
$allowed_pattern = implode('|', $allowed);
// the entire regexp (a little stricter than yours)
$pattern = "/\{function=\"($allowed_pattern)\((.*?)\)\"\}/";
if( preg_match($pattern, $string, $matches) ) {
# string DOES contain an allowed function
# The $matches things is optional, but nice. $matches[1] will be the function name, and
# $matches[2] will be the arguments string. Of course, you could just do a
# preg_replace_callback() on everything instead using the same pattern...
} else {
# No allowed functions found
}
Массив $allowed
упрощает добавление / удаление разрешенных имен функций, а регулярные выражения более строги в отношении фигурных скобок, кавычек и общего синтаксиса, что, вероятно, является хорошей идеей.
Но, прежде всего, переверните ветки if..else или используйте !
. preg_match
предназначено для совпадения в строке, а не для сопоставления, которого там нет. Так что вы не можете заставить его вернуть true
за то, что не там
Тем не менее, как упомянул Альваро, регулярные выражения, вероятно, не лучший способ сделать это, и довольно рискованно представлять такие функции, независимо от остальной части кода. Если вам просто нужно сопоставить слова, это должно работать нормально, но так как это вызовы функций с произвольными аргументами ... хорошо. Я не могу порекомендовать это :)
Редактировать: В первый раз я использовал preg_quote
для развернутой строки, но это, конечно, просто экранирует символы канала, и тогда шаблон не будет работать. Так что пропустите preg_quote
, но затем просто убедитесь, что имена функций не содержат ничего, что могло бы испортить окончательный шаблон (например, пропустите каждое имя функции через preg_quote
до взрыва массива)