php正则匹配百度网址,php抓取百度邮编搜索结果,应改如何写正则表达式?

博主试图通过PHP从百度邮编搜索结果中提取邮编,最初使用正则表达式未成功。问题在于搜索结果包含HTML表格,适合使用XPath解析。提供的PHP代码示例展示了如何利用XPath找到邮编,并给出了正确匹配邮编的正则表达式修改建议。该问题涉及到网页数据抓取和字符串处理技术。
摘要由CSDN通过智能技术生成

本人小白,想通过百度邮编搜索截取一个地址的邮编,在自己的网站空间里放了个php脚本。

因为要求不是很高,试图通过正则匹配找到第一组“首位不为0的六位数字”,作为结果输出,但是不管怎么尝试,得到的始终是一个空数组……

正则表达式是我从网上找的,也是过不同的形式,但是始终都得不到任何值

<?php

$final_url = 'http://opendata.baidu.com/post/s?wd=%C9%BD%B6%AB%CA%A1%BC%C3%C4%CF%CA%D0%C0%FA%CF%C2%C7%F8&p=mini&rn=20';

$search_result = file_get_contents($final_url);

$clear_result = strip_tags($search_result);

echo mb_detect_encoding($search_result);

echo("</br>");

echo($clear_result);

echo("</br>");

$zipcodes = search_for_zipcodes($clear_result);

print_r($zipcodes);

function search_for_zipcodes($test) {

$rule = '/^[1-9]\d{5}$/';

preg_match_all($rule,$test,$result);

return $result;

}    ?>

mb_detect_encoding($search_result)

,写这一句是想看看返回回来的页面的编码,但是这个函数似乎也得不到任何结果……

如果漏洞百出烦请诸位大神耐心指教,本人真的是小白一只……

题主啊, 你好.

我觉得, 你这个任务, 用不到正则.

为什么呢?

请看里面的搜索结果是什么?

<table class="table-list" cellspacing="0"><tr><th class="head-postcode">邮编</th><th class="head-region">行政区域</th></tr><tr><td>250102</td><td><em>山东省</em> <em>济南市</em> <em>历下区</em> 经十路双号2218-5150</td></tr><tr><td>250102</td><td><em>山东省</em> <em>济南市</em> <em>历下区</em> 经十东路双号33188-33688</td></tr><tr><td>250102</td><td><em>山东省</em> <em>济南市</em> <em>历下区</em> 经十路单号177-3799</td></tr><tr><td>250102</td><td><em>山东省</em> <em>济南市</em> <em>历下区</em> 旅游路港沟水利站机关公寓</td></tr></table>

好完整的结果, 这已经是一个列表了.

因为具体还没有看, 一会我来告诉你怎么处理.我先php试一下.

<?php

//有单独邮编的网址

$url = 'http://opendata.baidu.com/post/s?wd=%C9%BD%CE%F7&p=mini&rn=20';

// 没有单独邮编的网址

//$url= 'http://opendata.baidu.com/post/s?wd=%C9%BD%B6%AB%CA%A1%BC%C3%C4%CF%CA%D0%C0%FA%CF%C2%C7%F8%C6%BD%B0%B2%BA%FA%CD%AC&p=mini&rn=20';

// xpath 解析文档

$dom = new DOMDocument;

libxml_use_internal_errors(TRUE);

$dom->loadHTMLFile($url);

libxml_clear_errors();

$xPath = new DOMXPath($dom);

//起作用的语句

$trs = $xPath->query('//li/a/text()|//tr/td');

//输出结果

foreach($trs as $tr) {

$str= $tr->nodeValue;

if(strlen($str)>6){

$str =  array_pop( explode(' ', $str));

}

echo $str;

break;

}

?>

http://phpfiddle.org/

你去phpfiddle 试一下吧, 还行. 做这种工作, xpath方便点.

<?php

$final_url = 'http://opendata.baidu.com/post/s?wd=%C9%BD%B6%AB%CA%A1%BC%C3%C4%CF%CA%D0%C0%FA%CF%C2%C7%F8&p=mini&rn=20';

$search_result = file_get_contents($final_url);

$search_result = iconv('gbk', 'utf-8', $search_result);

preg_match_all("@<td>(\d+)</td><td>(.*?)</td></tr>@is", $search_result, $match);

$area = array_map("strip_tags", $match[2]);

print_r($match[1]);

print_r($area);

把$rule = ‘/^[1-9]\d{5}$/’;换成

$rule = ‘/[1-9]\d{5}/’;试试

因为,你用了strip_tags.所以,很多内容,都直接合并成“一行”了。再用^,$应该是匹配不到的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值