正则表达式匹配PHP变量和字符串连接

时间:2014-04-27 08:50:24

标签: php regex string variables pcre

我正在尝试构建一个匹配不同类型的echo语句的正则表达式.... echo这个词已经匹配了..

要匹配的示例模式

"hiii";
"how"."are"."you";
$var."abc";
"abc".$var;
'how'."how".$var;

var

的模式
/^[a-zA-Z_][a-zA-Z0-9_]*/

我已经有一个匹配前2个模式的模式......

/((^"[^"]*"\.{0,1})*;)/

3 个答案:

答案 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.

演示:https://eval.in/142721

相关

答案 2 :(得分:0)

您可以使用以下正则表达式执行此操作,而无需使用递归:

^"[^"]+"(\."[^"]+")*;$

演示:http://regex101.com/r/oW5zH4