我已经加载了整个页面的HTML,并希望检索所有以http开头并以pdf结尾的网址。我写了以下哪些不起作用:
$html = file_get_contents( "http://www.example.com" );
preg_match( '/^http(pdf)$/', $html, $matches );
我对正则表达式很新,但从我所学到的^
标志着模式的开始,$
标志着结束。我做错了什么?
答案 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 );
您需要匹配http
和pdf
之间的部分,这是.*?
正在做的事情。
^
匹配字符串的开头,$
结束,但当你想从较长的文本中提取这些链接时,这不是你想要的。
\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 );
更好(工作)