Почему 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 возвращать это?

3

Решение

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

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

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

)

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

5

Другие решения

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

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

элементы 1..N захватить специальные матчи

PS: другой способ выразить то же самое может быть

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

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

Демо-версия: http://regex101.com/r/lF3kP7/1

9

По вопросам рекламы [email protected]