PHP从字符串获取所有URL

PHP从字符串获取所有URL,php,preg-match-all,Php,Preg Match All,因此,我尝试从一个字符串中获取所有URL,脚本如下所示: $file = file_get_contents('something.txt'); function getUrls($string) { preg_match_all('~href=("|\')(.*?)\1~', $string, $out); print_r($out); } getUrls($file); Array ( [0] => Array (

因此,我尝试从一个字符串中获取所有URL,脚本如下所示:

$file = file_get_contents('something.txt');

function getUrls($string) {
    preg_match_all('~href=("|\')(.*?)\1~', $string, $out);
    print_r($out);
}

getUrls($file);
Array
(
    [0] => Array
        (
            [0] => href="#A"
            [1] => href="#B"
            [2] => href="#C"
        )

    [1] => Array
        (
            [0] => "
            [1] => "
            [2] => "
        )

    [2] => Array
        (
            [0] => #A
            [1] => #B
            [2] => #C

        )

)
本文档中包含的URL可能不完善,即“/blah/blah.asp?2”。问题是,当我运行此脚本时,我会得到一个如下所示的数组:

$file = file_get_contents('something.txt');

function getUrls($string) {
    preg_match_all('~href=("|\')(.*?)\1~', $string, $out);
    print_r($out);
}

getUrls($file);
Array
(
    [0] => Array
        (
            [0] => href="#A"
            [1] => href="#B"
            [2] => href="#C"
        )

    [1] => Array
        (
            [0] => "
            [1] => "
            [2] => "
        )

    [2] => Array
        (
            [0] => #A
            [1] => #B
            [2] => #C

        )

)
知道这里会发生什么吗?我不知道为什么它会返回带有散列符号的字母列表,而不是所需的URL。我怎样才能直接返回URL呢

邪恶之路:

$file = file_get_contents('something.txt');    

function displayUrls($string) {
    $pattern = '~\bhref\s*+=\s*+["\']?+\K(?!#)[^\s"\'>]++~';
    preg_match_all($pattern, $string, $out);
    print_r($out[0]);
}

displayUrls($file);
好办法是:

$doc = new DOMDocument();
@$doc->loadHTMLFile('something.txt');
$links = $doc->getElementsByTagName('a');
foreach($links as $link) {
    $href = $link->getAttribute('href');
    if ($href[0] != '#') $result[] = $href;
}
print_r($result);

有数百个这样的问题,我已经通过他们,大多是他们解决的情况下涉及完美的网址,如http://www.example.com,而不是缩短我要找的。我已经尝试了很多解决方案-没有骰子。打印内容的东西。txt+1,我喜欢这样的答案。。。这个答案就像一块罗塞塔石头,帮助我们找到更好的方法。哇,是的,这是一个很棒的答案。我希望我能投两次赞成票。