preg_match_all не соответствует всем возможностям

Я пытаюсь получить все совпадения, но получаю только одно

Вот моя строка

$html = '<p> This is my Home Page.</p><p><span style="line-height: 1.42857;">{{ type="slider" }} </span></p><p> </p>';

Если вы видите, что строка содержит {{ type="slider" }} , теперь, если я напишу эту строку только один раз, я получу ожидаемый результат, но если я напишу ее несколько раз в строке html, например {{ type="slider" }} {{ type="banned" }} {{ type="testimonial" }}

$html = '<p> This is my Home Page.</p><p><span style="line-height: 1.42857;">{{ type="slider" }} {{ type="banner" }} {{ type="testimonial" }}  </span></p><p> </p>';

и попытайтесь получить значения в моей строке {{ type=" ???? " }}, это показывает странный результат

Я использую этот код ниже.

preg_match_all('/{{ type=\"(.+)\" }}/', $html, $matches, PREG_SET_ORDER);
echo "<pre>";
print_r($matches);
foreach ($matches as $val) {
    echo "matched: ". $val[0] . "<br/>";
    echo "My Value" . $val[1] . "<br/>"; 
}

Текущий результат:

Array
(
    [0] => Array
        (
            [0] => {{ type="slider" }} {{ type="banner" }} {{ type="testimonial" }}
            [1] => slider" }} {{ type="banner" }} {{ type="testimonial
        )

)
matched: {{ type="slider" }} {{ type="banner" }} {{ type="testimonial" }}
My Value : slider" }} {{ type="banner" }} {{ type="testimonial

Я ожидаю результата в массиве со значениями, записанными между {{ type=" и " }}

только с {{ type="slider" }} я получаю этот результат, который идеален.

Array
(
    [0] => Array
        (
            [0] => {{ type="slider" }}
            [1] => slider
        )

)
matched: {{ type="slider" }}
My Value : slider

Есть идеи ?

Извините за мой плохой английский.


person Punit Gajjar    schedule 02.09.2016    source источник
comment
попробуй preg_match_all('/{{ type=\"(.+?)\" }}/mi', $html, $matches, PREG_SET_ORDER);   -  person zanderwar    schedule 02.09.2016


Ответы (2)


Вам нужно, чтобы ваше регулярное выражение соответствовало нежадному, добавив либо ? :

preg_match_all('/{{ type=\"(.+?)\" }}/', $html, $matches, PREG_SET_ORDER);

или модификатор U:

preg_match_all('/{{ type=\"(.+)\" }}/U', $html, $matches, PREG_SET_ORDER);
person Mike    schedule 02.09.2016
comment
stackoverflow.com/questions/39286071/ Можете ли вы ответить на этот вопрос? - person Punit Gajjar; 02.09.2016

То, что вы сейчас получаете, вполне нормально, поскольку по умолчанию ваше регулярное выражение является жадным, то есть /{{ type="(.+)"}} / ищет самую длинную строку, начинающуюся с {{ type=" и заканчивающуюся }}.

Другой ответ здесь предлагает вам добавить «не жадный» квантификатор ?, и он будет работать, но это не лучшее решение (потому что для этого потребуется больше работы от механизма регулярных выражений).

Вместо этого вам лучше просто заменить (.+) на ([^"]+) в вашем регулярном выражении.

person cFreed    schedule 02.09.2016
comment
Мои способности к регулярным выражениям отстой, поэтому я просто поддержу ваш ответ :) - person Mike; 02.09.2016
comment
Хорошо, но таким образом я не могу получить значение, записанное в type= . - person Punit Gajjar; 02.09.2016
comment
@PunitGajjar Вероятно, потому что вы попробовали мою первую версию, где я забыл скобки для захвата! Посмотрите текущую версию. - person cFreed; 02.09.2016
comment
@Mike Спасибо за честное отношение! - person cFreed; 02.09.2016
comment
stackoverflow.com/questions/39286071/, можете ли вы решить эту проблему? - person Punit Gajjar; 02.09.2016