2016-09-02 6 views
1

Я пытаюсь получить всех матчей однако я только получать одинне 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 

Любая идея?

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

+0

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

ответ

4

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

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

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

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

Perfectttt !!!!!!!!!! ! ... Спасибо –

+0

http://stackoverflow.com/questions/39286071/preg-match-all-find-match-multiple-stings-and-get-the-values-written-in-double-q Можете ли вы этот вопрос ? –

1

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

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

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

+0

Мое средство регулярного выражения сосать, поэтому я просто отвечу на ваш ответ :) – Mike

+0

Хорошо, но таким образом я не могу получить значение, записанное в type = "". –

+0

@PunitGajjar Наверное, потому что вы пробовали мою первую версию, где я забыл захватывающие круглые скобки! Посмотрите на текущую версию. – cFreed