Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用于查找HTML字符串中所有路径的正则表达式_Php_Html_Regex - Fatal编程技术网

Php 用于查找HTML字符串中所有路径的正则表达式

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" 有什么想法吗?更新:使用正则表达式进行操

我有一个字符串,带有htmlentities编码的HTML代码

我要做的是查找文档中的所有路径,位于:

href=“XXX”,src=“XXX”

我确实有一个正则表达式,可以找到以http、https、ftp和文件开头的所有链接,以免我对其进行迭代:

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