Регулярное выражение, начинающееся с http и заканчивающееся pdf? - PullRequest
8 голосов
/ 07 июня 2011

Я загрузил весь HTML-код страницы и хочу получить все URL-адреса, начинающиеся с http и заканчивающиеся pdf. Я написал следующее, которое не сработало:

$html = file_get_contents( "http://www.example.com" );
preg_match( '/^http(pdf)$/', $html, $matches );

Я довольно новичок в регулярных выражениях, но из того, что я узнал, ^ отмечает начало шаблона, а $ отмечает конец. Что я делаю не так?

Ответы [ 5 ]

8 голосов
/ 07 июня 2011

Вы должны соответствовать символам в середине URL:

/\bhttp[\w%+\/-]+?pdf\b/
  • \b соответствует границе слова

  • ^ и $ отмечают начало и конец всей строки . Вы не хотите их здесь.

  • [...] соответствует любому символу в скобках

  • \w соответствует любому символу слова

  • + соответствует одному или нескольким предыдущим матчам

  • ? делает + ленивым, а не жадным

4 голосов
/ 07 июня 2011

preg_match( '/http[^\s]+pdf/', $html, $matches );

Совпадения http, за которыми следуют не ([^...]) пробелы (\s) один или несколько раз (+) с последующим pdf

1 голос
/ 07 июня 2011

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

preg_match_all('/\bhttp\S*?pdf\b/', $html, $matches);

Обратите внимание, что здесь вам необходимо использовать preg_match_all() -функцию , поскольку вы пытаетесь сопоставить более одного вхождения.^ и $ не будут работать, потому что они применяются только к границам строк или файлов (в зависимости от используемых модификаторов).

1 голос
/ 07 июня 2011

Попробуйте,

preg_match( '/\bhttp\S*pdf\b/', $html, $matches );

Вам нужно сопоставить часть между http и pdf, это то, что делает .*?.

^соответствует началу строки и $ концу, но это не то, что вам нужно, когда вы хотите извлечь эти ссылки из более длинного текста.

\b соответствует границам слова

Обновление

для полноты, .*? будет по-прежнему слишком много совпадать, поэтому при обмене на \S*

\S соответствует непробельный символ

0 голосов
/ 07 июня 2011

preg_match( '/^http.*pdf$/', $html, $matches );

лучше (работает)

...