У меня есть строка вроде ниже, которая поступает из БД.
$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]);
Пожалуйста, дайте мне знать, как я могу получить желаемые результаты?
RegEx
(?<=\$x\[).*(?=\])
демонстрация
$re = "/(?<=\$x\[).*(?=\])/"; $str = "Sample String"; preg_match_all($re, $str, $matches);
объяснение
LookBehind
– шаблон соответствия должен появиться после $x[
— (?<=\$x\[)
. Если шаблон должен быть сопоставлен, то XYZ
затем за XYZ
$X
должен существовать.
.*
сопоставлять все после последнего совпадающего шаблона
LookAhead
– (?=\])
– LookAhead
все до ]
Поскольку PHP интерполирует переменные (переменные начинаются со знаков доллара) внутри строк с двойными preg_match_all
это предотвращает размещение регулярного выражения 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 )