Найти URL для файла в HTML, используя регулярное выражение - PullRequest
1 голос
/ 18 декабря 2010

Я поставил перед собой несколько амбициозную первую задачу в изучении регулярных выражений (и ту, которая связана с проблемой, которую я пытаюсь решить).Мне нужно найти любой экземпляр URL, который заканчивается на .m4v, в большой строке HTML.

Моя первая попытка была для файлов jpg

http.*jpg

Что, конечно, кажется правильнымна первый взгляд, но, конечно, возвращает такие вещи:

http://domain.com/page.html" title="Misc"><img src="http://domain.com/image.jpg

Что соответствует выражению в теории.Так что на самом деле мне нужно поместить в http.*m4v что-то вроде «только самый близкий экземпляр между http и m4v».Есть идеи?

Ответы [ 2 ]

2 голосов
/ 18 декабря 2010

Как вы заметили, выражение, такое как следующее, является жадным:

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"
}

Объяснение в комментариях.

1 голос
/ 18 декабря 2010

Perl, ruby, php и javascript должны работать с этими:

/(http:\/\/(?:(?:(?!\http:\/\/).))+\.jpg)/

URL-адреса будут храниться в соответствующих группах. Протестировал это против "http://a.com/b.jpg-folder/c.jpg <a href="http://mydomain.com/some.jpg-folder/foo.jpg" rel="nofollow">http://mydomain.com/some.jpg-folder/foo.jpg</a>", и он работал правильно, не будучи слишком жадным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...