2013-07-24 7 views
1

У меня проблемы с совпадением [*], который иногда бывает, а иногда нет. У кого-нибудь есть предложения?PHP - Preg_match_all необязательный матч

$name = 'hello $this->row[today1][] dfh fgh df $this->row[test1] ,how good $this->row[test2][] is $this->row[today2][*] is monday'; 
echo $name."\n"; 
preg_match_all('/\$this->row[.*?][*]/', $name, $match); 
var_dump($match); 

выход: привет $ this-> строка [тест], как хорошо $ this-> строка [test2] составляет $ this-> строка [сегодня] [*] является понедельником

array (
0 => 
    array (
    0 => '$this->row[today1][*]', 
    1 => '$this->row[test1] ,how good $this->row[test2][*]', 
    2 => '$this->row[today2][*]', 
), 
) 

Теперь совпадение [0] [1] берет слишком много, потому что оно соответствует до следующего «[]», а не заканчивается на «$ this-> row [test]». Я предполагаю, что [*]/добавляет шаблон. Как-то нужно проверить, есть ли следующий символ [перед сопоставлением с []. Кто угодно?

Благодаря

+0

попробовать '/ (\ $ this-> Строка \ (\ [^ \)] * \))/' – Orangepill

+0

попробуйте это, preg_match_all ('/\$this->row(\[.*?\])(\[\*\])?/', $ name, $ match); – Nightmare

+0

оба они не соответствуют – Karassik

ответ

0

[, ] и * специальные мета-символы в регулярных выражениях, и вам необходимо, чтобы избежать их. Также вам нужно сделать последний [] факультативно согласно вашему вопросу.

После этих предложений следующих должно работать:

$name = 'hello $this->row[today1][] dfh fgh df $this->row[test1] ,how good $this->row[test2][] is $this->row[today2][*] is monday'; 
echo $name."\n"; 
preg_match_all('/\$this->row\[.*?\](?:\[.*?\])?/', $name, $match); 
var_dump($match); 

ВЫВОД:

array(1) { 
    [0]=> 
    array(4) { 
    [0]=> 
    string(20) "$this->row[today1][]" 
    [1]=> 
    string(17) "$this->row[test1]" 
    [2]=> 
    string(19) "$this->row[test2][]" 
    [3]=> 
    string(21) "$this->row[today2][*]" 
    } 
} 
+0

Прекрасное спасибо. Некоторое время я возился с этим. Последний ? сделать предыдущий сегмент опционным? – Karassik

+0

Добро пожаловать. Да, это правильно '?' Делает предыдущую группу опциональной. – anubhava