在PHP中的子字符串后捕获方括号之间的文本

时间:2014-07-01 12:50:29

标签: php regex

我的字符串如下所示,来自DB。

$temp=Array(true);
if($x[211] != 15)
    $temp[] = 211;
if($x[224] != 1)
    $temp[] = 211;
if(sizeof($temp)>1) {
    $temp[0]=false;
}
return $temp;

我需要找到方括号内的所有值,后跟$ x变量。即211和224。

我尝试下面的代码,我在本网站上找到了答案,但它返回方括号中的所有值,包括一个跟随$ temp变量的值。

preg_match_all("/\[(.*?)\]/", $text, $matches);
print_r($matches[1]);

请让我知道如何才能得到这样的结果?

2 个答案:

答案 0 :(得分:1)

正则表达式

(?<=\$x\[).*(?=\])

Demo

$re = "/(?<=\$x\[).*(?=\])/"; 
$str = "Sample String"; 

preg_match_all($re, $str, $matches);

<强>解释

  • LookBehind - 匹配模式应该在$x[ --- (?<=\$x\[)之后。如果要匹配的模式为XYZ,那么XYZ $X后面应该存在。

  • .*在最后一个匹配模式之后匹配

  • LookAhead - (?=\]) - 匹配所有直到]

答案 1 :(得分:0)

由于PHP在双引号字符串中插入变量(变量以美元符号开头),因此将preg_match_all正则表达式放在单引号字符串中会阻止这种情况。虽然“$”仍然在正则表达式中被转义,因为它是一个正则表达式的锚字符。

在这种情况下/x\[(.*?)\]/也有效,但我认为你越精确越好。

$text = '
$temp=Array(true);
if($x[211] != 15)
    $temp[] = 211;
if($x[224] != 1)
    $temp[] = 211;
if(sizeof($temp)>1) {
    $temp[0]=false;
}
return $temp;
';

preg_match_all('/\$x\[(.*?)\]/', $text, $matches);
print_r($matches[1]);

输出:

Array ( [0] => 211 [1] => 224 )