原文件:
$ip=IP地址: 211.138.13.66
$add=来   自: 河北省石家庄市 移动
使用php正则匹后结果,应该怎么写匹配规则啊
$ip=211.138.13.66 
$add=河北移动

解决方案 »

  1.   

    $ip='IP地址: 211.138.13.66';
    $add='来   自: 河北省石家庄市 移动';
    echo preg_replace('#IP地址:\s+(.+)#','$1',$ip);
    echo '<br>';
    echo preg_replace('#来   自:\s+(.+)省[^\s]+\s+(.+)#','$1$2',$add);
      

  2.   

    谢谢jordan102,我试了一下,单独运行是可以的,但放到代码中运行的还是有问题,始终找不到原因,请帮忙看下:<?php
    function getip($ip){
    $baidu_html = file_get_contents('http://www.baidu.com/s?wd=' . $ip);
    $preg = '!<p class="op_ip_detail">(.*?)</p>\s*<p class="op_ip_detail">(.*?)(?=</p>)!';
    preg_match($preg, $baidu_html, $line);
    $ipaddr=$line[1] . "<br>";
    $isp=$line[2] . "<br>";
    //echo $ipaddr;
    //echo $isp;
    $ip1=preg_replace('#IP地址:\s+(.+)#','$1',$ipaddr);
    echo '<br>';
    $ip2=preg_replace('#来   自:\s+(.+)省[^\s]+\s+(.+)#','$1$2',$isp);
    echo $ip1;
    echo $ip2;
    }getip('211.138.13.66');?>运行结果还是:IP地址: 211.138.13.66
    来   自: 河北省石家庄市 移动
      

  3.   

    用匹配方便点
    preg_match('#IP地址:&nbsp;([^<]+)#s',$ipaddr,$ar);
    $ip1=$ar[1];
    echo '<br>';
    preg_match('#<strong>(.+)省[^\s]+\s+([^<]+)</strong>#s',$isp,$m);
    $ip2=$m[1].$m[2];
    echo $ip1;
    echo $ip2;
      

  4.   

    返回的内容中有 <meta http-equiv="content-type" content="text/html;charset=utf-8">
    表示返回的内容是 utf-8 编码的
    你的规则串中有中文,也需要是 utf-8 编码的
    另外规则 '#来   自:\s+(.+)省[^\s]+\s+(.+)#' 欠妥!
    为什么省级单位就一定有“省”呢?比如:内蒙古自治区、上海市 就没有“省”
      

  5.   

    嗯,谢谢!通过中文匹配问题很多,php能否只获取文件的前2行与后2行呢
    例如:$ipadd变量的值为:"广东省佛山市 电信",获取这个变量的前2行与后2行,结果:广东电信。
      

  6.   

    mb_internal_encoding("UTF-8");
    $ipadd="广东省佛山市 电信";
    echo mb_substr($ipadd,0,2) . mb_substr($ipadd,-2) ;
      

  7.   

    首先谢谢xuzuning、jordan102热心的回复。下面3段代码,单独放到一个文件中执行的结果没有问题,显示:广东电信
    mb_internal_encoding("UTF-8");
    $ipadd="广东省佛山市 电信";
    echo mb_substr($ipadd,0,2) . mb_substr($ipadd,-2) ; 但是放到下边的代码中后,还是有问题,怀疑是字符编码问题,使用mb_convert_encoding转换后还是有问题,还请指点原因。感谢~~<?php
    function getip($ip){
    $baidu_html = file_get_contents('http://www.baidu.com/s?wd=' . $ip);
    $preg = '!<p class="op_ip_detail">(.*?)</p>\s*<p class="op_ip_detail">(.*?)(?=</p>)!';
    preg_match($preg, $baidu_html, $line);
    $ipaddr=$line[1] . "<br>";
    $isp=$line[2] . "<br>";$outip = explode(":", $ipaddr);
    $outipnew=$outip[1];
    echo $outipnew;$ispnew = explode(":", $isp);
    $ipaddnew=$ispnew[1];
    mb_convert_encoding($ipaddnew,"utf-8");
    mb_internal_encoding("utf-8");
    echo mb_substr($ipaddnew,0,2,"utf-8") . mb_substr($ipaddnew,-2,"utf-8"); }getip('14.223.191.58');?>结果显示:
    14.223.191.58
    &n正常情况应该显示:
    14.223.191.58
    广东电信
      

  8.   

    你的 $ipaddnew前面还有&nbsp; 和 标签,那么取肯定是取不到的,#3 的方法不行吗。
      

  9.   

     $ipaddnew前面还有&nbsp; 和 标签 //没看明白?是指$isp=$line[2] . "<br>";这段吗?谢谢!
      

  10.   

    我去掉了$isp=$line[2] 后面的"<br>";还是不行,还请高手指点。
    谢谢!
      

  11.   

    $ipaddnew=$ispnew[1];
    echo $ipaddnew;
    exit;查看源码
      

  12.   

    你的程序应该是GB2312或者GBK的把
    function getip($ip){
    $baidu_html = file_get_contents('http://www.baidu.com/s?wd=' . $ip);
    //$baidu_html =iconv("UTF-8", "GBK//IGNORE", $baidu_html); 
    $preg = '!<p class="op_ip_detail">(.*?)</p>\s*<p class="op_ip_detail">(.*?)(?=</p>)!';
    preg_match($preg, $baidu_html, $line);
    $ipaddr=$line[1] . "<br>";
    $isp=$line[2] . "<br>";$outip = explode(":", $ipaddr);
    $outipnew=$outip[1];
    echo $outipnew;$ispnew = explode(":", $isp);
    $ipaddnew=preg_replace('/\<br\>|\&nbsp\;/', '',strip_tags($ispnew[1]));
    echo mb_substr($ipaddnew,0,6) . mb_substr($ipaddnew,-6); }
    getip('14.223.191.58');假如你的是GBK或gb1232的程序就启用注释的那句话,如本身是utf8的就不用了
      

  13.   

    header('Content-type: text/html;charset=utf-8');
    function getip($ip){
      $baidu_html = file_get_contents('http://www.baidu.com/s?wd=' . $ip);
      $preg = '!<p class="op_ip_detail">.*;([\d.]+)</p>\s*<p class="op_ip_detail">.*?strong>(.*?)(?=</strong>)!';
      preg_match($preg, $baidu_html, $line);
      echo $line[1] . "<br>";
      echo $line[2] . "<br>";
    }getip('14.223.191.58');14.223.191.58
    广东省佛山市 电信
      

  14.   

    jordan102 //直接echo $ipaddnew显示的正常的,即:广东省佛山市 电信xuzuning //加上header('Content-type: text/html;charset=utf-8');这行一行,切割后的地址仍然显示&n,正确的情况是显示:广东电信chinmo //假如你的是GBK或gb1232的程序就启用注释的那句话,如本身是utf8的就不用了。怎么知道程序是的编码类型呢,我的操作系统编码类型是utf-8。
      

  15.   

    测试我的就知道了,字节数不一样,而且你里面还含有hrml代码