我正在尝试构建一个正则表达式,用于匹配不同类型的echo语句。。。。单词echo已经匹配。。
要匹配的示例模式
"hiii";
"how"."are"."you";
$var."abc";
"abc".$var;
'how'."how".$var;
var 模式
/^[a-zA-Z_][a-zA-Z0-9_]*/
我已经有一个模式来匹配前两个模式。。。
/((^"[^"]*"'.{0,1})*;)/
在给出的两个建议旁边,如果您正在寻找基于PHP PCRE的正则表达式来验证PHP的子集,可以通过为您正在寻找的令牌指定命名子模式来更结构化地完成这项工作。这里有一个示例性的正则表达式模式,它正在寻找这些模式,甚至允许任何基于ascii的扩展单字节字符集周围有空白(就像PHP所做的那样)(我认为这就是PHP实际处理它的方式,即使它在你的文件中是UTF-8):
~
(?(DEFINE)
(?<stringDoubleQuote> "(?:''"|[^"])+")
(?<stringSingleQuote> '(?:'''|[^'])+')
(?<string> (?:(?&stringDoubleQuote)|(?&stringSingleQuote)))
(?<variable> '''$([a-zA-Z_'x7f-'xff][a-zA-Z0-9_'x7f-'xff]*))
(?<varorstring> (?:(?&variable)|(?&string)))
)
^ 's* (?&varorstring) (?: 's* '. 's* (?&varorstring) )* 's* ; $
~x
由于有了命名的子模式,可以很容易地为任何字符串或变量使用令牌,并添加空白处理和字符串连接运算符。这样分配给$pattern
,一个使用示例是:
$lines = <<<'LINES'
"hiii";
"how"."are"."you";
$var."abc";
"abc".$var;
'how'."how".$var;
LINES;
foreach (explode("'n", $lines) as $subject) {
$result = preg_match($pattern, $subject);
if (FALSE === $result) {
throw new LogicException('PCRE pattern did not compile.');
}
printf("%s %s match.'n", var_export($subject, true), $result ? 'did' : 'did not');
}
输出:
'"hiii";' did match.
'"how"."are"."you";' did match.
'$var."abc";' did match.
'"abc".$var;' did match.
'''how''."how".$var;' did match.
演示:https://eval.in/142721
相关
- 使用preg_match查找所有PHP变量
- 如何检查字符串是否是有效的XML元素名称?(另一个子模式示例)
- php从双引号中提取字符串
- PHP语法规范表达(2010年11月;通过hakre)
- PHP PCRE
- PCRE-Perl兼容正则表达式
正则表达式并不是万能的解决方案。例如,在这种情况下,很容易注意到您想要解析PHP代码。就像不应该用regex解析HTML一样,也不应该用正则表达式解析PHP。
相反,使用PHP的标记化器,它可以用来解析PHP表达式。
您可以使用以下正则表达式来完成此操作,而无需使用递归:
^"[^"]+"('."[^"]+")*;$
演示:http://regex101.com/r/oW5zH4