Регулярные выражения - Ответ лежит каждый раз в разных карманах :(

lantastic

Новичок
Регулярные выражения - Ответ лежит каждый раз в разных карманах :(

вот две строки:

href=http://www.yandex.ru class="a1"
href=http://www.yandex.ru

хочу научиться выделять отсюда URL ... очевидно, после URL стоит либо пробел, либо строка завершается совсем ...

вот мой код для этого:

PHP:
preg_match("#href=(?:(.+ )|(.+$))#", $str, $matches);
проблема в том, что для первой строки URL лежит в кармане $matches[1], а для второй строки - в кармане $matches[2] ... нельзя ли как то сделать, чтоб URL лежал в одном кармане всегда? Спасиб.
 

lantastic

Новичок
ты имел ввиду наверное
PHP:
"#href=(.+)(?: |$)#"
я этот вариант тоже пробовал - но странно, он не работает на первой строке ... не тормозит на пробеле и все! хватает всю строку целиком ...
 

SelenIT

IT-лунатик :)
Точно... ступил, жадность забыл инвертировать. Надо
PHP:
"#href=(.+?)(?:\s|$)#"
или
PHP:
"#href=(.+)(?:\s|$)#U"
(на всякий случай заодно запишем пробел более универсально)
 

lantastic

Новичок
Заработало, большое спасибо! :)

И вот вопросик небольшой, вернемся к первоначальному варианту:

PHP:
preg_match("#href=(?:(.+ )|(.+$))#", $str, $matches);
мы смогли избавиться от двух скобок благодаря тому, что у них внутри начало было одинаковое .+ ... допустим, внутри разные выражения ... а с образцом совпадает только одно из них ... получается, выражение все равно попадает в разные карманы, как выкручиваются из такой ситуации?
 

SelenIT

IT-лунатик :)
А зачем делать большую общую скобку незахватывающей? Пусть первый карман соответствует ей целиком...
 
Сверху