我尝试使用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);
我没有想法......
答案 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!