Php 用于查找HTML字符串中所有路径的正则表达式
我有一个字符串,带有htmlentities编码的HTML代码 我要做的是查找文档中的所有路径,位于: href=“XXX”,src=“XXX” 我确实有一个正则表达式,可以找到以http、https、ftp和文件开头的所有链接,以免我对其进行迭代:Php 用于查找HTML字符串中所有路径的正则表达式,php,html,regex,Php,Html,Regex,我有一个字符串,带有htmlentities编码的HTML代码 我要做的是查找文档中的所有路径,位于: href=“XXX”,src=“XXX” 我确实有一个正则表达式,可以找到以http、https、ftp和文件开头的所有链接,以免我对其进行迭代: "/\b(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)[-A-Z0-9+&@#\/%=~_|$?!:,.]*[A-Z0-9+&@#\/%=~_|$]/i" 有什么想法吗?更新:使用正则表达式进行操
"/\b(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)[-A-Z0-9+&@#\/%=~_|$?!:,.]*[A-Z0-9+&@#\/%=~_|$]/i"
有什么想法吗?更新:使用正则表达式进行操作是不可靠的。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;
}
更新:使用正则表达式执行此操作不可靠。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;
}
可以使用DOM查找特定标记中的所有链接。例如,要从锚定标记获取URL,请执行以下操作(未经测试,但应指向正确的方向):
您可以使用XPath更轻松地加载和计算DOM。您可以使用DOM查找特定标记中的所有链接。例如,要从锚定标记获取URL,请执行以下操作(未经测试,但应指向正确的方向):
您可以使用XPath更轻松地加载和计算DOM。为什么不尝试查找
href=“
和下一个”
之间的所有内容?这会更简单,也不容易出错。那么href=“([^”]*)”
?URL中是否允许“使用”呢?我认为空格实际上是…@P O'Conbhui:spaces是不允许的,还有“
字符为什么不尝试查找href=“
和下一个”
之间的所有内容呢?这会更容易,也不容易出错。那么href=“([^”]*)”
呢?是“允许在URL中使用吗?我认为空格实际上是…@P O'Conbhui:spaces是不允许的,还有”
字符
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;
}