RegEx для preg_match_all не работает

Это моя строка ($string):

    swatch: 'http://abc.com/aa.jpg',
    zoom:[
      'http://abc.com/bb.jpg'
    ],
    large:[

      'http://abc.com/cc.jpg'
    ],

Я использую следующий шаблон в своем файле PHP и хочу сопоставить http://abc.com/bb.jpg:

preg_match_all('/(?<=zoom:\[\s{15}\').*(?=\')/', $string, $image);

Но ничего не возвращается. Что я должен делать?


person user1610115    schedule 09.05.2013    source источник
comment
забавно, ты действительно считал количество пробелов? Используйте \s* и добавьте модификатор s для соответствия новым строкам :) Также, если это JSON, используйте вместо этого json_decode().   -  person HamZa    schedule 09.05.2013
comment
Ах, как плохо, вы не можете использовать квантификаторы в поиске в PHP...   -  person HamZa    schedule 09.05.2013
comment
Насколько я знаю, вы не можете использовать квантификаторы ни в одном поисковом движке. Однако я согласен использовать для этого json_decode() вместо регулярного выражения.   -  person melwil    schedule 09.05.2013


Ответы (1)


Для простоты мы не будем использовать поиск, и хотя я сказал, что нам нужен модификатор s, я ошибся, он используется только для сопоставления новых строк с точками ., которые мы здесь не будем использовать, поэтому \s соответствует новому линия:

$string = <<<JSO
        swatch: 'http://abc.com/aa.jpg',
        zoom:[
          'http://abc.com/bb.jpg'
        ],
        large:[

          'http://abc.com/cc.jpg'
        ],
JSO;
preg_match_all('/zoom:\[\s*\'(?<img>[^\']*)\'\s*\]/', $string, $m);
print_r($m['img']);

Вывод:

Array
(
    [0] => http://abc.com/bb.jpg
)

Пояснение:

/ # Starting delimiter
    zoom:\[ # Matches zoom:[
    \s* # Matches spaces, newlines, tabs 0 or more times
    \'  # Matches '
    (?<img>[^\']*) # named group, matches everything until ' found
    \'  # Matches '
    \s* # Matches spaces, newlines, tabs 0 or more times
    \]  # Matches ]
/ # Ending delimiter
person HamZa    schedule 09.05.2013
comment
Спасибо. Что означает буква "с" в конце? - person user1610115; 09.05.2013
comment
@ user1610115 Вы имеете в виду \s* ? Это будет соответствовать пробелам, новым строкам, табуляциям 0 или более раз. В противном случае есть модификатор s, который используется для сопоставления новых строк с точкой .. - person HamZa; 09.05.2013