2014-03-25 29 views
0

我试图用RegExp从字符串中提取单词(读取:函数),并将它们传递给PHP函数。RegExp - 查找不以特定字符开头的字

下工作得很好,已经:

$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

你能展示一些示例输入字符串和预期结果吗? – Toto

+0

请看这里:http://regex101.com/r/vD6nQ0#PCRE在这个脚本中,作为一个结果,它得到'current_action',尽管它只存在于字符串中的$ current_action中,而不是一个函数。 – Alphawolf

回答

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]); 

我使用的是负回顾后杰夫的建议以及一个正向前查找每个后(检查字,但没有使(部分匹配。

我去了(部分,因为它定义了一个PHP函数,就我而言。

我愿意改进! :-)感谢杰夫!

+0

呵呵,如果函数名后面都跟着'(',那么是的,这是要走的路,现在你可能会删除ungreedy标志:'$ re ='/(?<!\ $)(\ b \ S + \ b)(?= \()/';'工作方式完全一样,但稍短一点:) – Jerry

+0

不错,谢谢。:) – Alphawolf

1

可以使用负回顾后,使确保没有$你的函数/变量前面:

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

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

/[^$](\b.+\b)/的距离应该会更近一些,但是这个在字符串开始时可能不起作用。

+0

嗨,杰里,我也读过关于负面后视的内容,现在你提到了它,起初我很开心,但这似乎没有什么区别。我仍然得到完全相同的结果,有或没有消极的后视部分。我做了两次检查,字符串中没有'get_function'函数,而是一个变量'$ get_function',我得到'get_function'存在于字符串中的结果,即使它不是。 – Alphawolf

+0

@Alphawolf嗨!嗯,你可以给你一个输入字符串的样本吗?也许有更好的解决方法?函数和变量不能包含空格,对吗?也许'(?<!\ $)(\ b \ S +?\ b)'会更适合? [regex101演示](http:// regex101。com/r/jR3xA3) – Jerry

+0

嗯。似乎它确实工作:http://regex101.com/r/vD6nQ0#PCRE然而,在我的脚本中,我仍然得到'current_action',即使它只存在于字符串中的$ current_action',从不作为一项功能。调查......迄今为止,杰里! :-) – Alphawolf

相关问题