2015-02-24 3 views
1

Я пытаюсь отсканировать файл PHP для определения переменных, например. $ Тест = "1"; и вернуть как имя переменной и значение, вот что я пытался до сих пор:Регулярное выражение целая строка не соответствует компонентам

preg_match_all('/\$(.*)="(.*)";/', $content, $out); 

Это прекрасно работает, когда у меня есть много переменных, определенных над отдельными строками, например:

$test1="1"; 
$test2="2"; 
$test3="3"; 

Но когда переменные определены один рядом друг с другом, тогда мой матч просто возвращает одну гигантскую строку, например

$test1="1";$test2="2";$test3="3"; 

Я думаю, что это происходит потому, что оно интерпретируется как:

$test1="[content]"; 
Where [content] = 1";$test2="2";$test3="3 

Есть ли обходной путь для этого? Мне нужно, чтобы ЗАСТАВИТЬ по существу новый матч, как только он сталкивается с «, а не просто в конце

ответ

2

Вы должны сделать свои матчи не жадный Вы можете сделать это с помощью квантора *? вместо *...

$content = '$test1="1";$test2="2";$test3="3";'; 

$out = array(); 

preg_match_all('/\$(.*?)="(.*?)";/', $content, $out); 

var_dump($out); 

Выход:

array(3) { 
    [0]=> 
    array(3) { 
    [0]=> 
    string(11) "$test1="1";" 
    [1]=> 
    string(11) "$test2="2";" 
    [2]=> 
    string(11) "$test3="3";" 
    } 
    [1]=> 
    array(3) { 
    [0]=> 
    string(5) "test1" 
    [1]=> 
    string(5) "test2" 
    [2]=> 
    string(5) "test3" 
    } 
    [2]=> 
    array(3) { 
    [0]=> 
    string(1) "1" 
    [1]=> 
    string(1) "2" 
    [2]=> 
    string(1) "3" 
    } 
} 
1

Жадные такие выражения, как .* будет пытаться соответствовать как можно больше, удовлетворяя оставшиеся экспресс ион. При каждом присваивании на отдельной строке (и в отсутствие модификатора /s [dot-matches-all]) .* останавливается на первой встреченной новой строке; поэтому он работает, когда назначения назначаются по собственной линии.

Первое жадное выражение может быть изменено для использования отрицательного набора символов; второе жадный выражение должно быть сделано не жадный, присоединяя знак вопроса (потому что двойные кавычки могут быть экранированы, и вы в противном случае потребуется более сложный характер, чтобы принять это во внимание):

/\$([^=]*)="(.*?)";/ 

[^=]* будет соответствовать ничего, кроме знака равенства, тогда как .*? будет соответствовать как можно скорее, удовлетворяя оставшееся выражение.

Смежные вопросы