我有一个字符串,其中包含一个htmlentities编码的HTML代码。
我想要做的是在文档中找到所有路径:
href =“XXX”,src =“XXX”。
我有一个正则表达式,找到所有以http,https,ftp和file开头的链接,并且让我迭代它:
"/\b(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)[-A-Z0-9+&@#\/%=~_|$?!:,.]*[A-Z0-9+&@#\/%=~_|$]/i"
有什么想法吗?
答案 0 :(得分:5)
更新:使用正则表达式执行此操作并不可靠。 src =“..”或href =“..”语句可以是注释或javascript语句的一部分。为了可靠地获取链接,我建议使用XPath:
<?php
$html = file_get_contents('http://stackoverflow.com/questions/14782334/regex-expression-to-find-all-paths-in-a-html-string/14782594#14782594');
$doc = new DOMDocument();
@$doc->loadHTML($html);
$selector = new DOMXPath($doc);
$result = $selector->query('//a/@href | //@src');
foreach($result as $link) {
echo $link->value, PHP_EOL;
}
如果使用正则表达式,我会尝试获取href或src属性的= "
之间的内容。下面是一个如何使用正则表达式从此页面获取链接的示例:
<?php
$html = file_get_contents('http://stackoverflow.com/questions/14782334/regex-expression-to-find-all-paths-in-a-html-string');
preg_match_all('/href="(?P<href>.*)"|src="(?P<src>.*)"/U', $html, $m);
<--- note the U to make the
pattern ungreedy
var_dump($m['href']);
var_dump($m['src']);
答案 1 :(得分:4)
您可以使用DOM查找特定标记中的所有链接。例如,从锚标签获取网址会做类似这样的事情(未经测试,但它应该指向正确的方向):
function findPaths($url)
{
$dom = new DOMDocument();
//$url of page to search, the "@' is there to suppress warnings
@$dom->loadHTMLFile($url)
$paths = array();
foreach($dom->getElementsByTagName('a') as $path)
{
$paths[] = array('url' => $path->getAttribute('href'), text => $path->nodeValue);
}
return $paths;
}
使用XPath加载和评估DOM可以更轻松。