我已经加载了页面的整个HTML,并希望检索所有以http开头、以pdf结尾的URL。我写了以下内容,但没有成功:
$html = file_get_contents( "http://www.example.com" );
preg_match( '/^http(pdf)$/', $html, $matches );
我对regex还很陌生,但从我所学到的知识来看,^
标志着模式的开始,$
标志着结束。我做错了什么?
您需要匹配URL中间的字符:
/bhttp[w%+/-]+?pdfb/
b
匹配单词边界^
和$
标记整个字符串的开始和结束。你不希望他们在这里。[...]
匹配括号中的任何字符w
匹配任何单词字符+
与前一个匹配中的一个或多个匹配?
使+
懒惰而非贪婪
preg_match( '/http[^s]+pdf/', $html, $matches );
将http
后跟not([^...]
)空格(s
)匹配一次或多次(+
)后跟pdf
试试这个,
preg_match( '/bhttpS*pdfb/', $html, $matches );
您需要匹配http
和pdf
之间的部分,这就是.*?
正在做的。
^
匹配字符串的开头,$
匹配字符串的结尾,但当您想从较长的文本中提取这些链接时,这不是您想要的。
b
在字边界上匹配
更新
为了完整起见,.*?
仍然会与S*
匹配太多
S
匹配非空白字符
试试这个:
preg_match_all('/bhttpS*?pdfb/', $html, $matches);
请注意,您需要在这里使用preg_match_all()
-函数,因为您试图匹配多个匹配项。^
和$
不起作用,因为它们只适用于行或文件边界(取决于使用的修饰符)。
preg_match( '/^http.*pdf$/', $html, $matches );
更好(工作)