2013-11-27 2 views
0

У меня есть некоторый код, как показано ниже, и я использую регулярное выражение, чтобы вытащить определенное содержание из:PHP регулярного выражения второго вхождения

Содержимого

[vc_row][vc_column width="1/1"][vc_column_text] 
[dt_divider style="thin"/] 

size 18" x 18" 
[dt_divider style="thin"/] 

£70 
[/vc_column_text] 

я использовал следующее, чтобы получить размер:

preg_match_all("#\[dt_divider.*\](.*)\[dt_#Us", $content, $matches3); 
$picsize = $matches3[1][0]; 

print $picsize; 

, а затем попытался получить цену с помощью:

preg_match_all("#\[dt_divider.*\](.*)\[/vc_#Us", $content, $matches4); 
$price = $matches4[1][0]; 

print $picsize; 

Приведенный выше код только массивы из:

Array ([0] => Array ([0] => [dt_divider style="thin"/] size 18" x 18" [dt_divider style="thin"/] £70[/vc_) [1] => Array ([0] => size 18" x 18" [dt_divider style="thin"/] £70)) 

Как заставить его игнорировать первый [dt_divider style="thin"/] так просто подхватывает второй?

Надежда, что имеет смысл :-)

ответ

1
"#\[dt_divider[^\]]*\]([^\[]*)\[/vc_#Us" 

Должен исправить вашу проблему, хотя вы меняете регулярное выражение возможно. Как и ваш размер, цена будет в группе захвата 1.

Проблема с вашим регулярным выражением заключалась в том, что .* пытается соответствовать как можно больше.

Я использую [^\]]* и [^\]]*, чтобы заменить два .*. Они говорят, что соответствуют 0 для многих (*) символов, которые не являются ] или [ (\] или \[).

Working Example

Немного улучшенная версия будет:

"#\[dt_divider[^\]]*\]\s*([^\[]*?)\s*\[/vc_#Us" 

Это делает то же самое, но любой пробел (в новой строке) по цене будет исключен из матча.

+0

Это работало блестяще! Очень признателен! – user1857612

+0

@ user1857612 Рад помочь – OGHaza

0

Вы должны быть в состоянии захватить его с \[dt_divider style="thin"\/\]\s*£([\d\.]+)

матча группы: [121-123]

70

0
preg_match_all("/^\[dt_divider style=\"thin\"\/\][\n\r]+\s*\K[^\n\r]+/m", $s, $m) 

См демо here.

Смежные вопросы