Как вы заметили, выражение, такое как следующее, является жадным:
http:.*\.jpg
Это означает, что оно читает как можно больше входных данных, удовлетворяя выражению.
Это "*
"оператор, который делает его жадным.Существует четкая методика регулярных выражений, позволяющая сделать это не жадным… используйте «?»Модификатор после "*
".
http:.*?\.jpg
Теперь он будет соответствовать как можно меньшему количеству, в то же время удовлетворяя выражению (т. е. остановит поиск при первом появлении ".jpg".
Конечно, если у вас есть .jpg в середине URL, например:
http://mydomain.com/some.jpg-folder/foo.jpg
Он не будет соответствовать полному URL.
Вы захотите определитьконец URL-адреса как нечто, что нельзя считать частью URL-адреса, например пробел или новая строка, или (если URL-адрес вложен в круглые скобки), закрывающая скобка. Эту проблему нельзя решить с помощьюоднако, только одно маленькое регулярное выражение, если оно включено в письменный язык, поскольку URL-адреса часто неоднозначны.
Возьмем, к примеру:
At this page, http://mysite.com/puppy.html, there's a cute little puppy dog.
Технически запятая может быть частью URL.иметь дело с множеством неоднозначностей при поиске URL-адресов в письменном тексте, и трудно избежать ошибок из-за неоднозначностей.
EDIT | Вот пример регулярного выражения в PHP, которое быстро игрязный раствор, будучи только жаднымгде необходимо и пытается разобраться с английским языком:
<?php
$str = "Checkout http://www.foo.com/test?items=bat,ball, for info about bats and balls";
preg_match('/https?:\/\/([a-zA-Z0-9][a-zA-Z0-9-]*)(\.[a-zA-Z0-9-]+)*((\/[^\s]*)(?=[\s\.,;!\?]))\b/i', $str, $matches);
var_dump($matches);
Выводит:
array(5) {
[0]=>
string(38) "http://www.foo.com/test?items=bat,ball"
[1]=>
string(3) "www"
[2]=>
string(4) ".com"
[3]=>
string(20) "/test?items=bat,ball"
[4]=>
string(20) "/test?items=bat,ball"
}
Объяснение в комментариях.