<?
$body="测试内容<a href=\"link.php\" target=\"_blank\">内部链接</a>测试内容";//$body="测试内容<a href=\"http://www.baidu.com/link.php\" target=\"_blank\">外部链接测试内容</a>";//$body="测试内容https://www.baidu.com/link.php外部链接,测试内容";//$body="测试内容<a href=\"link.php\" target=\"_blank\">http://www.baidu.com/link.php</a>";//这也属于内部链接,所以正则思路应该考虑到各方面//正则思路:href=[(.*)]{0,10}:\/\/
//思路是这样的,如何包含href=就检测他后面和://之前的0至10位,等于是否是href=http://、href=ftp://等等的格式
//如果包含href=http://或href=ftp://或href=https://等,即为外部链接,如果仅href=即为内部链接
if (!preg_match("/这里用正则/i", $body)){echo "抱歉,不能使用内部链接";}else{echo "链接为外部链接,通过";
}
?>
//////////////想法是这样的,但怎么把代码写出来,请高手帮忙,谢谢!!!!

解决方案 »

  1.   


    $html = <<<HTML
    测试内容<a href=\"link.php\" target=\"_blank\">内部链接</a>测试内容
    测试内容<a href=\"http://www.baidu.com/link.php\" target=\"_blank\">外部链接测试内容</a>
    测试内容https://www.baidu.com/link.php外部链接,测试内容
    HTML;$pat = '/href="(.+?)"|(http(?:s?).+[\w{2,3}|\/])/i';
    preg_match_all($pat, stripcslashes($html), $matches);
    $url_arr = array_filter(array_merge($matches[1],$matches[2]));
    #echo '<pre>'.print_r($url_arr,1).'</pre>';foreach ($url_arr as $v){
    $t = parse_url($v);
    if (!$t['host']){
    echo $v.': 内部链接.<br/>';
    }
    else {
    echo $v.': 外部链接.<br/>';
    }
    }
    /**
    link.php: 内部链接.
    http://www.baidu.com/link.php: 外部链接.
    https://www.baidu.com/link.php: 外部链接.
    */
      

  2.   


    谢谢高手,但是我的思路不是得出有几个内部链接或外部连接,我需要得出正文中所有链接是否有内部链接如果有,就提示,让对方改成外面连接,如果都是外部链接,就通过,能再帮忙一下吗,谢谢!if (怎么全文检测("/这里用正则/i", $body)){echo "抱歉,文章中包含内部链接,请修改";}else{echo "链接为外部链接,通过";
    }
      

  3.   

    我都写成这样了,你还不知道怎么去改成你想要的东西啊。foreach ($url_arr as $v){
        $t = parse_url($v);
        if (!$t['host']){
    //        echo $v.': 内部链接.<br/>';
              echo "抱歉,文章中包含内部链接,请修改";
              exit;
        }
    //    else {
    //        echo $v.': 外部链接.<br/>';
    //    }
    }
    echo "链接为外部链接,通过";
      

  4.   


    不好意思,因为你的代码写的太好,一时我都忘记我的原意了,抱歉抱歉!我的原意并不是要的你那样的结果,因为我要分析的是超链接,而不是分析网址,<a href=\"link.php\" target=\"_blank\">http://www.baidu.com/link.php</a>
    比如这个就是内部超链接<a href=\"http://www.baidu.com/link.php\" target=\"_blank\">http://www.baidu.com/link.php</a>
    这个这是外部超链接我要看整个文章中,是否有包含href=link.php,还是href=http://这样的如果直接href=link.php即是内部链接,要提醒他人改,然后后面的link.php不固定所以正则思路是:href=[(.*)]{2,10}:\/\/
    看href=后面和://之间有没有http或ftp或https等,来分析是不是内部链接,{2,10}是防止<a href=\"link.php\" target=\"_blank\">http://www……这种内部链接格式
    或者正则href=(.*)(?!>)(.*)://
    即href=和://之间不能包含>
    这样来防止<a href=\"link.php\" target=\"_blank\">http://www……这种内部链接格式但具体怎么写正则不会,请帮忙,谢谢!
      

  5.   


    另外你的代码中,还没有兼顾到单引号的链接:
    $html = <<<HTML
    <a href='1link.php'>测试内容</a>
    HTML;不好意思,麻烦你了,帮帮忙
      

  6.   

    你幽默了。
    不知道你所说的内部链接是否跟我想的一样,我理解的意思是:链接中包含有www.xxx.com(cn)之类的即为外部链接,如果不包含即为内部链接。
    如果是这样,那么参看下面://这里测试内容里面的数据就是文章内容,你可以复制一篇过来测试。
    $html = <<<HTML
    测试内容<a href=\"link.php\" target=\"_blank\">内部链接</a>测试内容
    测试内容<a href=\"http://www.baidu.com/link.php\" target=\"_blank\">外部链接测试内容</a>
    测试内容https://www.baidu.com/link.php外部链接,测试内容
    HTML;$pat = '/href="(.+?)"|(http(?:s?).+[\w{2,3}|\/])/i';//这段模式是用来匹配文章中的链接用的,分为两部分,一个是<a href="xxx"形式,另一个就是非标签内的正文链接
    preg_match_all($pat, stripcslashes($html), $matches);
    $url_arr = array_filter(array_merge($matches[1],$matches[2]));//这里合并两部分匹配的链接并去空
    #echo '<pre>'.print_r($url_arr,1).'</pre>';//这个数组里面包含文章里的所有链接foreach ($url_arr as $v){//循环各链接
        $t = parse_url($v);//这个函数,具体参看手册
        if (!$t['host']){//如果没有主机名,则认为是内部链接
           echo "抱歉,文章中包含内部链接,请修改";
    //在这里提醒修改,然后程序会退出
          exit;
        }
    }
    echo "链接为外部链接,通过";//已经到这一步了,说明前面没有内部链接。
      

  7.   

    还真是,让你贱笑了。$pat = '/href=[\'"](.+?)[\'"]|(http(?:s?).+[\w{2,3}|\/])/i';
      

  8.   


    你正则掌握的太好了,十分敬佩,刚又考虑了几个超链接因素,还有错的地方:
    $html = <<<HTML
    <a href='1link.php'>测试内容1</a>
    <a href=\"2link.php\" target=\"_blank\">内部链接2</a>
    测试内容<a href=\"http://3www.baidu.com/link.php\" target=\"_blank\">外部链接测试内容3</a>
    测试内容https://4www.baidu.com/link.php外部链接,测试内容4
    <a href=http://527.0.0.1>测试内容5</a>
    <a color=\"#800000\" href=http://627.0.0.1>测试内容6</a>
    <a href=http://727.0.0.1 color=#800000>测试内容7</a>
    <a href='http://827.0.0.1' color='#800000'>测试内容8</a>
    <a href=\"http://927.0.0.1\" color=\"#800000\">测试内容9</a>
    <a href=\"http://1027.0.0.1\" color=\"#800000\"  style=\"white-space:nowrap\">测试内容10</a>
    HTML;
    好人做到底,看再看看,修正一下,没有引号的情况下有错,链接文本加了颜色后有错,谢谢!
      

  9.   

    -_-! 这我太失败了,漏这么多。$pat = '/href=[\'"]?(.+?)(?:[\'"]| |>)|(http(?:s?).+[\w{2,3}|\/])/i';
      

  10.   

    修正版,上面的有问题。$pat = '/href=[\'"]?(.+?)(?:[\'"]| |>)|(http(?:s?).+\.\w{2,3}\/?)/i';
      

  11.   


    还是不行,只取出了第四个“测试内容https://4www.baidu.com/link.php外部链接,测试内容4
      

  12.   

    我这边用这个模式是匹配出来10个了。$pat = '/href=[\'"]?(.+?)(?:[\'">]| )|(http(?:s?).+\.\w{2,3}\/?)/i';
      

  13.   


    那就奇怪了,我用这个也就得到一个:
    <?
    $html = <<<HTML
    <a href='1link.php'>测试内容1</a>
    <a href=\"2link.php\" target=\"_blank\">内部链接2</a>
    测试内容<a href=\"http://3www.baidu.com/link.php\" target=\"_blank\">外部链接测试内容3</a>
    link.php
    测试内容https://4www.baidu.com/link.php外部链接,测试内容4
    <a href=http://527.0.0.1>测试内容5</a>
    <a color=\"#800000\" href=http://627.0.0.1>测试内容6</a>
    <a href=ftp://727.0.0.1 color=#800000>测试内容7</a>
    <a href='http://827.0.0.1' color='#800000'>测试内容8</a>
    <a href=\"c/11111.php\" color=\"#800000\">测试内容9</a>
    <a href=\"https://1027.0.0.1\" color=\"#800000\"  style=\"white-space:nowrap\">测试内容10</a>
    HTML;
    只得到:
    Array
    (
        [3] => https://4www.baidu.com/link.php
    )https://4www.baidu.com/link.php: 外部链接.
      

  14.   


    是得不到嘛,完整测试代码如下:<?
    $html = <<<HTML
    <a href='1link.php'>测试内容1</a>
    <a href=\"2link.php\" target=\"_blank\">内部链接2</a>
    测试内容<a href=\"http://3www.baidu.com/link.php\" target=\"_blank\">外部链接测试内容3</a>
    link.php
    测试内容https://4www.baidu.com/link.php外部链接,测试内容4
    <a href=http://527.0.0.1>测试内容5</a>
    <a color=\"#800000\" href=http://627.0.0.1>测试内容6</a>
    <a href=ftp://727.0.0.1 color=#800000>测试内容7</a>
    <a href='http://827.0.0.1' color='#800000'>测试内容8</a>
    <a href=\"c/11111.php\" color=\"#800000\">测试内容9</a>
    <a href=\"https://1027.0.0.1\" color=\"#800000\"  style=\"white-space:nowrap\">测试内容10</a>
    HTML;$pat = '/href=[\'"]?(.+?)(?:[\'">]| )|(http(?:s?).+\.\w{2,3}\/?)/i';
    preg_match_all($pat, stripcslashes($html), $matches);
    $url_arr = array_filter(array_merge($matches[2],$matches[3]));
    #echo '<pre>'.print_r($url_arr,1).'</pre>';foreach ($url_arr as $v){
        $t = parse_url($v);
        if (!$t['host']){
            echo $v.': 内部链接.<br/>';
        }
        else {
            echo $v.': 外部链接.<br/>';
        }
    }
    ?>