Php 函数调用的正则表达式?

Php 函数调用的正则表达式?,php,regex,Php,Regex,我想简单地从函数调用中提取一些引用的文本,并想知道是否可以获得一些关于regex的帮助 字符串的外观如下所示: 'MyFunction(“myString”);' 本质上,我希望扫描一个文件,查找调用“MyFunction”的任何行,然后捕获引号中的字符串文字 后续问题 我该如何避免使用这些注释行 更新 我可以用:解决我的问题 MyFunction\s*\(\s*“(.*?\”\s*\)\s* 感谢@devyndraen和所有人的帮助 [^(]*("([^"]*)") 然后组号1将是引号中的字

我想简单地从函数调用中提取一些引用的文本,并想知道是否可以获得一些关于regex的帮助

字符串的外观如下所示: 'MyFunction(“myString”);'

本质上,我希望扫描一个文件,查找调用“MyFunction”的任何行,然后捕获引号中的字符串文字

后续问题
我该如何避免使用这些注释行

更新
我可以用:
解决我的问题
MyFunction\s*\(\s*“(.*?\”\s*\)\s*

感谢@devyndraen和所有人的帮助

[^(]*("([^"]*)")
然后组号1将是引号中的字符串。不过你得自己再引用一遍


(这不是很科学,因为它可能会拾取一些您不想要的东西)

我不确定您对格式有什么样的要求,因此我假设在正常编程的地方可能有任意大小的空间

结果字符串将位于\1反向引用中

MyFunction\s*\(\s*"(.*?)\"\s*\)\s*;

我建议使用带有标志
s的非贪婪正则表达式(Java中的DOTALL)(假设此函数调用的括号内没有注释:

$regex = '/MyFunction.*?\(.*?"(.*?)".*?\).*?;/s';

如果使用
preg_match($regex,$str,$matches)
$matches[1]

中的参数将可用,以补偿已注释的行或块,在应用regex之前,您首先需要过滤文件以删除所有注释。对于PHP,您可以使用以下方法:



$example='
line 1
line 2 // comment 1
line 3 # comment 2
// comment 3.1
# comment 3.2
/*
   comment 4.1
   comment 4.2
*/
line 9 /* comment 5.1
comment 5.2
*/';

echo '<h3>Example Text</h3><pre>'.$example.'</pre><hr>';

$regex='/
    (?x)
    (?:
        # single-line inline comments beginning at col#1
        (?s)
        (?:\\/\\/|\\#)
        [^\\n]+
        \\n
    |
        # single-line inline comments beginning after col#1 
        # preserve leading content
        (?m)
        ^
        (.+?)
        (?:\\/\\/|\\#)
        .*?
        $
    |
        # multi-line comments
        (?s)
        \\/
        \\*
            (?:.|\\n)*?
        \\*
        \\/
    )
/x';

echo '<h3>Regular Expression</h3><pre>'.$regex.'</pre><hr>';

$result=preg_replace( $regex, '$1', $example);

echo '<h3>Result</h3><pre>'.$result.'</pre><hr>';


$example='1
第1行
第2行//评论1
第3行#评论2
//评论3.1
#评论3.2
/*
评论4.1
评论4.2
*/
第9行/*评论5.1
评论5.2
*/';
回显“示例文本”。$Example.
; $regex='1/ (?x) (?: #从第1列开始的单行内联注释 (?s) (?:\\/\\/|\\#) [^\\n]+ \\n | #从第1列开始的单行内联注释 #保留主要内容 (?m) ^ (.+?) (?:\\/\\/|\\#) .*? $ | #多行注释 (?s) \\/ \\* (?:.|\\n)*? \\* \\/ ) /x′; 回显“正则表达式”。$regex.
; $result=preg_replace($regex,$1',$example); 回显“结果”。$Result。“
”;
产生:


示例文本 第1行 第2行//评论1 第3行#评论2 //评论3.1 #评论3.2 /* 评论4.1 评论4.2 */ 第9行/*评论5.1 评论5.2 */
正则表达式 / (?x) (?: #从第1列开始的单行内联注释 (?s) (?:\/\/|\#) [^\n]+ \n | #从第1列开始的单行内联注释 #保留主要内容 (?m) ^ (.+?) (?:\/\/|\#) .*? $ | #多行注释 (?s) \/ \* (?:.|\n)*? \* \/ ) /x
结果 第1行 第2行 第3行 第9行
如果字符串
MyFunction(“…”)
出现在字符串文本或注释中,该怎么办?祝你好运。函数调用语法不规则:-)你在检查什么语言?@Platinum Azure,虽然我不是说这个问题应该由正则表达式解决,但大多数正则表达式实现可以匹配比常规语言更多的语言。除此之外,没有通用的“函数调用语法”:可能OP正在解析/匹配一些自主开发的常规DSL。我认为OP正在以正确的方式(tm)使用正则表达式来解决一次性问题,而不是将其放入生产代码中。所以95%的解决方案可能足够好了。@MK,没问题。在注意到你的销售代表后,我认为这是一个简单的错误。-1答案不能解决OP的问题。它缺少正确的转义,与所需的模式不匹配,并将创建空结果。尝试对“foo”使用它来同时查看所有三个问题。@MK,1。您需要通过添加反斜杠来转义在其各自双引号前后出现的开始和结束括号。这是普遍支持的,不依赖于我所知道的任何正则表达式引擎,对解决方案的成功至关重要。2.您的解决方案将为空字符串(即“”)返回一个空结果,这将需要在事实之后进行筛选以找到有用的结果。3.最后,您给出的解决方案将匹配以下所有字符串:“(”“)”、“foo”“、“”“”,这根本不是OP所需要的。@MK,进一步说,您使用“[^(]*”是不可操作的,因为它将匹配零个或多个非左参数。@MK,我想到,如果您的解决方案采用Unix shell或Vi(m)样式正则表达式,您不需要转义内部的括号集,但需要转义外部对以使它们捕获。(此外,shell或vi样式的正则表达式是一种非常特殊的情况,在任何其他环境中都不起作用,因此使用它们作为解决方案是有问题的。) line 1 line 2 // comment 1 line 3 # comment 2 // comment 3.1 # comment 3.2 /* comment 4.1 comment 4.2 */ line 9 /* comment 5.1 comment 5.2 */ / (?x) (?: # single-line inline comments beginning at col#1 (?s) (?:\/\/|\#) [^\n]+ \n | # single-line inline comments beginning after col#1 # preserve leading content (?m) ^ (.+?) (?:\/\/|\#) .*? $ | # multi-line comments (?s) \/ \* (?:.|\n)*? \* \/ ) /x line 1 line 2 line 3 line 9