Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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从文本中提取相对链接_Php_Regex_Dom - Fatal编程技术网

PHP从文本中提取相对链接

PHP从文本中提取相对链接,php,regex,dom,Php,Regex,Dom,我试图从html页面中提取所有链接,包括相关链接。我正在使用正则表达式获取所有URL——这很容易——但我也想找到相关链接。因此,我希望能够找到: <a href="http://www.google.com">Some Link</a> 我也希望能够找到 <a href="somepage.php">Some Other Link</a> 我需要使用尽可能少的内存尽快完成这项工作,所以我尽量避免使用DOM之类的东西。有人

我试图从html页面中提取所有链接,包括相关链接。我正在使用正则表达式获取所有URL——这很容易——但我也想找到相关链接。因此,我希望能够找到:

    <a href="http://www.google.com">Some Link</a>

我也希望能够找到

    <a href="somepage.php">Some Other Link</a>

我需要使用尽可能少的内存尽快完成这项工作,所以我尽量避免使用DOM之类的东西。有人有什么想法吗?

怎么样

\<a.*?(?:href=['"](.*)?['"]|\>)

\只是尝试一下这样的东西。够了吗

$a = '<a href="http://www.google.com">Some Link</a>';
$p = '/href=\"(?<href>.*?)\">(?<content>.*?)</';
preg_match_all($p, $a, $m);
var_dump($m);
$a='';

$p='/href=\“(?*?)\”>(?*?)那么,您可以只查找
href
src
属性?你需要它来获取所有链接,还是只获取属性中的链接?嗯,字符类
[]
和捕获组
()
..@HamZa我基本上使用
[]
来获取
中的链接,因为我相信
()
s通过保存匹配项来消耗更多内存:
它的工作方式有两种:简单地说,
[ab]
将匹配
a
b
。它与
(a | b)
相同,那么
(a | b)
将其添加到捕获组中。您可以使用非捕获组
(?:a | b)
。但是
[a | b]
意味着
匹配a、b或文字
@HamZa这是一个好音符。不过,它在
[href |>]
中并不太好用。还是把
|
放在那里好吗?字符类与组(捕获或不捕获)完全不同。一个字符类就像一个袋子,你可以将单个可能的字符按任何顺序放入其中(一种集合)
[href]
[refh]
[efhr]
[fhre]
[hfer]
[freh]
和so-weiter相同。因此,模式的这部分
[href=['“]
被视为一个字符类,可以用
[[r'e=“hf]
或任何您想要的置换来替换。现在,正如HamZa所解释的,如果您想在几个子字符串之间进行选择,必须使用将这些子字符串括在
内(?:…)
并用一个
|
分开。哈,是的,对不起,这是一种新的堆叠方式!
$b = '<a href="somepage.php">Some Other Link</a>';
preg_match_all($p, $b, $m2);
var_dump($m2);