Regex表达式来查找HTML字符串中的所有路径


Regex expression to find all paths in a HTML string

我有一个字符串,其中包含一个HTML实体编码的HTML代码。

我想做的是找到文档中的所有路径,在以下路径之间:

href="XXX",src="XXX"。

我确实有一个正则表达式,它可以查找以http、https、ftp和file开头的所有链接,以免我重复它:

"/'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;
}

如果使用regex,我会尝试获取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']);

您可以使用DOM来查找特定标记中的所有链接。例如,从锚标签中获取url可以这样做(未经测试,但它应该为您指明正确的方向):

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,使其更加容易。