2016-05-02 3 views
0

Не могу понять, почему условие OR в моем регулярном выражении не работает.Regexp: | (OR) условие не работает

$str = "       <li><a href=\"\" class=\"gateway-image\"><img src=\"<?=theme_url()?>/images/Cherry Credits.jpg\" alt=\"\"/></a></li> 
         <li><a href=\"\" class=\"gateway-image\"><img src=\"<?=theme_url()?>/images/gudangvoucher.jpeg\" alt=\"\" style=\"width: 140px!important\"/></a></li>"; 

    $regexp = '/^(.*\<li\>\<a href\=)(.*cherry|credits.*)$/im'; 
    preg_match($regexp, $str, $m); 

кажется регулярное выражение является правильным, но он не может найти строку Cherry Credits.jpg как я ожидал. Что не так?

+0

Ваше выражение ожидает либо 'cherry' в конце строки, либо' credits' сразу после 'href ='. Таким образом, совпадение не возвращается. –

+0

@ WiktorStribiżew но есть. * В конце –

+0

Даже если есть '. *', После «href =» нет «вишни». Каково правило для извлечения? Получите все значения «href», содержащие «вишню» или «кредиты»? –

ответ

0

Вы написали выражение с использованием якорей начала и конца строки ^ и $.

Это не соответствует, потому что ваша строка продолжается после cherryи есть дополнительные символы между href= и credits.

Вы можете либо удалить якоря линии:

(.*\<li\>\<a href\=)(.*cherry|credits.*) 

Или вы можете перемещать задний .* (и, вероятно, ведущий .*) вне группы захвата:

^(.*\<li\>\<a href\=).*(cherry|credits).*$ 
0

Вы должны удалить знак «$» в конце, потому что он ожидает окончания строки.

Попробуйте это:

^(.*\<li\>\<a href\=).*(cherry|credits)(\.jpg)

Вы можете использовать онлайн тестеры, как этот сайт: https://regex101.com/ и проверить, если вы делаете OK.