php preg_match()无法正常工作,找到一个var

时间:2017-05-20 03:31:47

标签: php regex preg-match

header.php文件

<?php
 echo 'this is example '.$adv['name'].' , this is another.....';

main.php文件

<?php

if(preg_match('/$adv[(.*?)]/',file_get_contents('header.php'),$itext)){
    echo $itext[1].'';
}

显示空

2 个答案:

答案 0 :(得分:2)

这个正则表达式将起作用

/\$adv\[(.*?)\]/

你需要在它们之前使用\来转义符号$,[,] 因为它们在正则表达式中具有特殊含义

答案 1 :(得分:1)

这是一个更有效的解决方案:

模式(Demo):

/\$adv\[\K[^]]*?(?=\])/

PHP实施:

if(preg_match('/\$adv\[\K[^]]*?(?=\])/','this is example $adv[name]',$itext)){
    echo $itext[0];
}

$itext的输出:

name

请注意,通过使用\K替换捕获组,目标字符串将在“完整字符串”匹配中返回,这有效地将输出数组减少了50%。

您可以看到演示链接以获取有关模式各个部分的说明,但基本上它与$adv[匹配,然后重置匹配点,匹配方括号之间的所有字符,然后对结束正方形进行正向前瞻支架不包含在退回的比赛中。

无论您是否要匹配不同的变量名称,您都可以使用:/\$[^[]*?\[\K[^]]*?(?=\])/。这将容纳adv或美元符号后面的任何其他子字符串。通过使用Negated Character Classes代替[^]]代替.来匹配无限制字符,正则表达式模式可以更有效地执行。

如果adv不是输入字符串的决定性组成部分,我会使用/\$[^[]*?\[\K[^]]*?(?=\])/因为它效率最高。