2014-10-28 5 views
2

Я пытаюсь определить, имеет ли строка какие-либо слова между двойными кавычками, используя preg_match_all, однако это дублирует результаты, и первый результат имеет два набора двойных кавычек с обеих сторон, где, когда искомая строка имеет только один набор.Почему preg_match_all возвращает два матча?

Вот мой код:

$str = 'Test start. "Test match this". Test end.'; 
$groups = array(); 
preg_match_all('/"([^"]+)"/', $str, $groups); 
var_dump($groups); 

И вар свалка производит:

array(2) { 
    [0]=> 
    array(1) { 
     [0]=> 
     string(17) ""Test match this"" 
    } 
    [1]=> 
    array(1) { 
     [0]=> 
     string(15) "Test match this" 
    } 
} 

Как вы можете видеть, что первый массив неправильно, почему preg_match_all возвращение этого?

+0

Оставьте скобки или добавьте несколько скобок, прочитайте руководство, и вы его исправьте. –

+0

Пожалуйста, определите * неправильный *. Как это не соответствует вашим ожиданиям, которые дает http://php.net/preg_match_all? – hakre

+1

Как вы не ошибаетесь, может быть и то, что вы вводите в заблуждение вывод var_dump здесь? – hakre

ответ

5

Привет, если ваш используете print_r вместо vardump вы увидите разницу в лучшую сторону.

Array 
(
    [0] => Array 
     (
      [0] => "Test match this" 
     ) 

    [1] => Array 
     (
      [0] => Test match this 
     ) 

) 

Первый содержит целую строку, а второй - ваш матч.

+0

Правильно, не понимал, что preg_match_all вернул оба, спасибо. – Styphon

9

возвращает 2 элемент, потому что:

Элемент 0 захватывает все найденной строку

Элементы 1..N захвата выделенных матчей.

PS: еще один способ выразить то же самое может быть

(?<=")[^"]+(?=") 

, который захватит точно такой же, но в этом случае вам не нужна дополнительная группа записи.

Демо: http://regex101.com/r/lF3kP7/1

+0

Это не дает ожидаемых результатов, он включает конечную строку - https://eval.in/210849 – Styphon

+0

@Avinash Raj: не могли бы вы прояснить свою мысль? – zerkms

+0

@Styphon: hint: '(? =") ' – zerkms