Intereting Posts

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 sting, например {{ 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=" and " }}

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

 Array ( [0] => Array ( [0] => {{ type="slider" }} [1] => slider ) ) matched: {{ type="slider" }} My Value : slider 

Есть идеи ?

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

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

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

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

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

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

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

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