问题描述
|
我正在寻找一个正则表达式,它将扫描文档以匹配函数调用,并仅返回第一个参数(字符串文字)的值。
该函数调用可能类似于以下任何一种:
MyFunction(\"MyStringArg\");
MyFunction(\"MyStringArg\",true);
MyFunction(\"MyStringArg\",true,true);
我当前正在使用:
$pattern = \'/Use\\s*\\(\\s*\"(.*?)\\\"\\s*\\)\\s*;/\';
但是,此模式仅与第一种形式匹配。
在此先感谢您的帮助!
更新资料
我能够通过以下方式解决我的问题:
$pattern = \'/Use\\s*\\(\\s*\"(.*?)\\\"/\';
谢谢贾斯汀!
〜斯科特
解决方法
如果只关心第一个参数的值,则可以将正则表达式的末尾截断:
$pattern = \'/Use\\s*\\(\\s*\"(.*?)\\\"/\';
但是,您应该理解,此方法(或针对此问题的任何纯正则表达式解决方案)都不是完美的,并且在某些情况下它可能无法正确处理。在这种情况下,您会得到误报,而转义引号(\\\"
)会破坏它。
您可以通过将其复杂一点来忽略转义的引号:
$pattern = \'/Use\\s*\\(\\s*\"(.*?)(?!<(?:\\\\\\\\)*\\\\)\\\"/\';
如果引号字符串内的“ 8”个字符前面带有奇数个反斜杠,则会忽略此字符。
但是,如果不引入假阴性,就无法解决假阳性问题,反之亦然。这是因为PHP是一种不规则的语言,因此无法使用“纯正则”正则表达式进行解析,甚至允许递归的现代正则表达式引擎也将需要一些非常复杂的代码来完成此工作。
我的意思是,如果您打算一次性完成一项工作,以快速浏览自己编写的某些PHP,则regex可能会很好。如果您正在寻找可以在任意PHP代码上实现此功能的健壮且开放式的功能,则需要某种反射或PHP解析器。
, 这可能会稍微简单一些,但是仅在双引号而不是单引号的情况下才有效:
$pattern = /Use\\s*[^\\\"]*\\\"([^\\\"]*)\\\"/