正则表达式以http开头,以pdf结尾


Regular expression starting with http and ending with pdf?

我已经加载了页面的整个HTML,并希望检索所有以http开头、以pdf结尾的URL。我写了以下内容,但没有成功:

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

我对regex还很陌生,但从我所学到的知识来看,^标志着模式的开始,$标志着结束。我做错了什么?

您需要匹配URL中间的字符:

/'bhttp['w%+'/-]+?pdf'b/
  • 'b匹配单词边界

  • ^$标记整个字符串的开始和结束。你不希望他们在这里。

  • [...]匹配括号中的任何字符

  • 'w匹配任何单词字符

  • +与前一个匹配中的一个或多个匹配

  • ?使+懒惰而非贪婪

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

http后跟not([^...])空格('s)匹配一次或多次(+)后跟pdf

试试这个,

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

您需要匹配httppdf之间的部分,这就是.*?正在做的。

^匹配字符串的开头,$匹配字符串的结尾,但当您想从较长的文本中提取这些链接时,这不是您想要的。

'b在字边界上匹配

更新

为了完整起见,.*?仍然会与'S* 匹配太多

'S匹配非空白字符

试试这个:

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

请注意,您需要在这里使用preg_match_all()-函数,因为您试图匹配多个匹配项。^$不起作用,因为它们只适用于行或文件边界(取决于使用的修饰符)。

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

更好(工作)