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

时间:2011-06-07 11:45:35

标签: php regex preg-match

我已经加载了整个页面的HTML,并希望检索所有以http开头并以pdf结尾的网址。我写了以下哪些不起作用:

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

我对正则表达式很新,但从我所学到的^标志着模式的开始,$标志着结束。我做错了什么?

5 个答案:

答案 0 :(得分:8)

您需要匹配网址中间的字符:

/\bhttp[\w%+\/-]+?pdf\b/
  • \b匹配字边界

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

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

  • \w匹配任何单词字符

  • +匹配上一场比赛中的一项或多项

  • ?+懒惰而非贪婪

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

试试这个,

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

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

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

\b匹配字边界

<强>更新

为了完整性,.*?仍会与\S*

交换得太多

\S匹配非空白字符

答案 3 :(得分:1)

试试这个:

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

请注意,您需要在此处使用preg_match_all()-function,因为您尝试匹配多个匹配项。 ^$无效,因为它们仅适用于行或文件边界(取决于使用的修饰符)。

答案 4 :(得分:0)

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

更好(工作)