我正在寻找一个正在扫描文档以匹配函数调用的正则表达式,并仅返回第一个参数(字符串文字)的值。
函数调用可能如下所示:
MyFunction("MyStringArg");
MyFunction("MyStringArg", true);
MyFunction("MyStringArg", true, true);
我目前正在使用:
$pattern = '/Use\s*\(\s*"(.*?)\"\s*\)\s*;/';
但是,此模式仅匹配第一种形式。
提前感谢您的帮助!
更新
我能够解决我的问题:
$pattern = '/Use\s*\(\s*"(.*?)\"/';
感谢贾斯汀!
〜斯科特
答案 0 :(得分:1)
如果你只关心第一个参数的值,你可以切断正则表达式的结尾:
$pattern = '/Use\s*\(\s*"(.*?)\"/';
但是,你应该明白这个(或者这个问题的任何纯正则表达式解决方案)都不是完美的,并且会有一些可能的错误处理的情况。在这种情况下,你会得到误报,并且转义引号(\"
)会破坏它。
您可以通过稍微复杂化来忽略转义引号:
$pattern = '/Use\s*\(\s*"(.*?)(?!<(?:\\\\)*\\)\"/';
如果它们前面有一些奇数反斜杠,则忽略引用字符串中的"
个字符。
然而,如果不引入假阴性,那么假阳性问题就无法得到帮助,反之亦然。这是因为PHP是一种不规则的语言,因此不能用“纯”正则表达式进行解析,即使是允许递归的现代正则表达式引擎也需要一些非常复杂的代码来完成这项工作。
我只是说,如果你计划一次性工作来快速搜索你自己编写的PHP,正则表达式可能就好了。如果您正在寻找可以在任意PHP代码上执行此操作的强大且开放式的东西,则需要某种反射或PHP解析器。
答案 1 :(得分:0)
这可能稍微简单,但只有双引号而不是单引号才有效:
$pattern = /Use\s*[^\"]*\"([^\"]*)\"/