本帖最后由 liujianliang 于 2011-08-03 16:18:03 编辑

解决方案 »

  1.   

    还有你匹配的应该是<a href="">中的href吧,普通的文本http形式的匹配吗?
      

  2.   

    只要是把匹配的网址搜集出来就行href属性里面的
      

  3.   

    $html = <<<html
    skjdfksjdkf<a href="http://www.baidu.com" id="abc">sdfjk</a>
    <a href="http://hi.baidu.com?info=aaa" id="abcdf">sdfjk</a>
    html;$r = '/<a[^href]*href="([^"]*)"/i';preg_match_all($r, $html, $a);
    echo '<pre>';print_r($a[1]);/*Array
    (
        [0] => http://www.baidu.com
        [1] => http://hi.baidu.com?info=aaa
    )*/
      

  4.   

    用dom解析,比正则简单。下载及参考地址
    http://simplehtmldom.sourceforge.net/<?php
    require("simple_html_dom.php");
    $html = file_get_html('http://www.425sf.com/');
    foreach($html->find('a') as $element) 
           echo $element->href . '<br>';
    ?>
      

  5.   

    如果只保留http://格式的绝对路径,筛掉相对路径的该怎么写?
      

  6.   

    $html = <<<html
    skjdfksjdkf<a href="http://www.baidu.com" id="abc">sdfjk</a>
    <a href="http://hi.baidu.com?info=aaa" id="abcdf">sdfjk</a>
    <a href="/a.php" id="abcdf">sdfjk</a>
    <a href="https://hi.baidu.com?info=aaa" id="abcdf">sdfjk</a>
    <a href="ftp://hi.baidu.com?info=aaa" id="abcdf">sdfjk</a>
    html;$r = '/<a[^href]*href="((http|https|ftp):\/\/[^"]*)"/i';//(http|https|ftp)这块你也可以增加其他的类型preg_match_all($r, $html, $a);
    echo '<pre>';print_r($a[1]);
      

  7.   

    上面没说清楚,有些域名后面带2.htm字符的,如http://www.0387.com/4.htm,只要把域名采集出来
      

  8.   

    lz正则只需要在上面加入一个正则模式匹配符号,去掉^ 和 $(因为匹配内容不是严格的必须从头到尾都匹配)
    $patten = "((https|http|ftp|rtsp|mms)?://)?(([0-9a-z_!~*'().&=+$%-]+:)?[0-9a-z_!~*'().&=+$%-]+@)?(([0-9]{1,3}\.){3}[0-9]{1,3}|([0-9a-z_!~*'()-]+\.)*([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\.[a-z]{2,6})(:[0-9]{1,4})?((/?)|(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)";
    preg_match_all('/'.str_replace('/','\\/', $patten) . '/i', $content, $matches);
    kyzy_yy_pm 的解决方案很好,我只是告诉网上的正则拿来在php中应该怎么用
      

  9.   

    $r = '/<a[^href]*href="((http|https|ftp):\/\/[^\/]+).*"/i';//(http|https|ftp)这块你也可以增加其他的类型
      

  10.   

    $html = <<<html
    skjdfksjdkf<a href="http://www.baidu.com" id="abc">sdfjk</a>
    <a href="http://hi.baidu.com?info=aaa" id="abcdf">sdfjk</a>
    <a href="/a.php" id="abcdf">sdfjk</a>
    <a href="https://hi.baidu.com?info=aaa" id="abcdf">sdfjk</a>
    <a href="ftp://hi.baidu.com?info=aaa" id="abcdf">sdfjk</a>
    html;$r = '/<a[^href]*href="((http|https|ftp):\/\/[^\/|\?|"]*)[^"]*"/i';preg_match_all($r, $html, $a);
    echo '<pre>';print_r($a[1]);/*Array
    (
        [0] => http://www.baidu.com
        [1] => http://hi.baidu.com
        [2] => https://hi.baidu.com
        [3] => ftp://hi.baidu.com
    )*/
      

  11.   


    哦哦,但我试了不行,我详细看了这个需求才看明白是采集域名的$url = "http://baidu.a98q.com/";
    $html = file_get_contents($url);
    $r = '/<a[^href]*href="((http|https|ftp):\/\/[^\/]+).*"/i';//(http|https|ftp)这块你也可以增加其他的类型
    preg_match_all($r, $html, $a);
    var_dump($a);
      

  12.   

    为什么html来源网址http://baidu.a98q.com/匹配不了呢?
      

  13.   

    那是因为它的页面中href属性没有双引号
    $r = '/<a[^href]*href="?((http|https|ftp):\/\/[^\/|\?|"| ]*)[^"]*"?/i';
      

  14.   

    你是指的重复吗?你用array_unique整理下就行了
      

  15.   

    如果不要端口的话:$r = '/<a[^href]*href="?((http|https|ftp):\/\/[\w|\.]*)[^"]*"?/i';
      

  16.   

    哈哈,现在找这个,可惜不知道看谁的。是不是用7楼的:
    $html = <<<html
    skjdfksjdkf<a href="http://www.baidu.com" id="abc">sdfjk</a>
    <a href="http://www.ku8sf.com?info=aaa" id="abcdf">sdfjk</a>
    html;$r = '/<a[^href]*href="([^"]*)"/i';preg_match_all($r, $html, $a);
    echo '<pre>';print_r($a[1]);/*Array
    (
        [0] => http://www.baidu.com
        [1] => http://hi.baidu.com?info=aaa
    )*/
      

  17.   

    Array
    (
      [0] => http://www.52xoyo.cn
      [1] => http://hi.baidu.com?info=aaa
    )*/