我正在尝试构建一个匹配不同类型的echo语句的正则表达式.... echo这个词已经匹配了..
要匹配的示例模式
"hiii";
"how"."are"."you";
$var."abc";
"abc".$var;
'how'."how".$var;
var
的模式/^[a-zA-Z_][a-zA-Z0-9_]*/
我已经有一个匹配前2个模式的模式......
/((^"[^"]*"\.{0,1})*;)/
答案 0 :(得分:1)
正则表达式不是解决所有问题的方法。例如,在这种情况下,您想要解析PHP代码很容易注意到。就像你不应该用正则表达式解析HTML一样,你不应该用正则表达式解析PHP。
相反,使用PHP's tokenizer,它可用于解析PHP表达式。
答案 1 :(得分:1)
除了两个给定的建议之外,如果您正在寻找基于PHP PCRE的正则表达式来验证PHP的一个子集,那么可以通过为您正在寻找的令牌指定命名子模式来更加结构化。这是一个示例性的正则表达式模式,即使允许任何基于us-ascii的扩展单字节字符集,也可以寻找这些模式,甚至允许空白(就像PHP一样)(我认为这就是PHP实际对待它的方式,即使它& #39;文件中的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.
答案 2 :(得分:0)