使用带有preg_match的正则表达式模式变量

时间:2011-12-28 21:00:11

标签: php regex escaping preg-match

我尝试使用preg_match从其他正则表达式问题中提出解决方案,但无济于事。

$match = '/^(.|a|an|and|the|this|at|in|or|of|is|for|to|its|as|by)\$/';
$filteredArray = array_filter($wordArray, function($x){
return !preg_match($match,$x);
});

当我包含字符串文字但我想使用变量以便我可以添加更多单词时,它会起作用。这个版本有效:

$filteredArray = array_filter($wordArray, function($x){
return !preg_match("/^(.|a|an|and|the|this|at|in|or|of|is|for|to|its|as|by)$/",$x);
});

我感谢任何帮助!

3 个答案:

答案 0 :(得分:2)

为何选择regexp?为什么不!in_array($x, $forbiddenWordsArray)?这样,更容易动态管理元素。

答案 1 :(得分:2)

由于variable scope,这不起作用。您无法从该函数访问变量$ match。

使用全局变量的解决方案。它们可以从任何地方访问。

$GLOBALS['word_regex'] = '/^(.|a|an|and|the|this|at|in|or|of|is|for|to|its|as|by)\$/';
$filteredArray = array_filter($wordArray, function($x){
return !preg_match($GLOBALS['word_regex'],$x);
});

那应该有用

答案 2 :(得分:2)

匿名函数不会自动从封闭范围捕获变量。您需要使用use声明明确地执行此操作:

$shortWords = '/^(.|a|an|and|the|this|at|in|or|of|is|for|to|its|as|by)\$/';
$filteredArray = array_filter($wordArray, 
                              function($x) use ($shortWords) {
                                  return !preg_match($shortWords,$x);
                              });