RegEx - 查找不以某个字符开头的单词

时间:2014-03-25 19:57:17

标签: php regex preg-replace

我尝试使用RegExp从字符串中提取单词(read:functions)并将它们传递给PHP函数。

以下效果非常好:

$func = preg_replace("/(\b.+\b)/Ue", 'extract_functions(\'\\1\')', $oneliner);

虽然它从字符串中提取现有函数,但它也提取具有相同名称但没有起始$字符的变量。

因此,如果字符串包含名为get_function的现有函数,它还会提取一个名为$get_function的变量但没有起始$,因此我无法确定是否有提取的函数或变量。

我的想法是排除以$开头的单词,但这似乎不起作用:

$func = preg_replace("/[(\b[^\$].+\b)/Ue", 'extract_functions(\'\\1\')', $oneliner);

我没有想法......

2 个答案:

答案 0 :(得分:1)

你可以使用负面的lookbehind来确保你的函数/变量之前没有$

$func = preg_replace("/(?<!\$)(\b.+\b)/Ue", 'extract_functions(\'\\1\')', $line);

顺便说一句[(\b[^\$]有点错误。您有一个包含(\b^$的字符类,它不起作用。它实际上会匹配任何这些字符,而不是匹配$字符。

/[^$](\b.+\b)/稍微接近但是这个字符串可能在字符串的开头不起作用。

答案 1 :(得分:1)

感谢杰夫,这里有适合我的解决方案:

$filecontent = file_get_contents($file); // Parsing the file's contents into a string
$re = '/(?<!\$)(\b\S+?\b)(?=\()/'; // The pattern
preg_match_all($re, $filecontent, $out, PREG_PATTERN_ORDER);

print_r($out[0]);

我正在使用Jeff建议的负面lookbehind 以及肯定前瞻在每个单词后检查(但是没有制作(比赛的一部分。

我选择了(部分,因为就我而言定义了PHP函数。

我愿意改进! :-)感谢Jeff!