在处理字符较多的网页时,使用preg_match和preg_match_all可能会遇到正则表达式失效的问题。这通常是因为默认的回溯限制较低导致的。
为了解决这个问题,有两种常见方法:
1. 使用ini_set('pcre.backtrack_limit', 1000000);
来临时增加回溯限制,默认值是100000。
2. 修改php.ini文件中的pcre.backtrack_limit
参数,以支持更大的字符串。
示例代码:抓取淘宝服饰栏
ini_set('pcre.backtrack_limit', 1000000); // 默认值是100000 $html = file_get_contents('http://www.taobao.com/'); $parLeft = preg_quote('', '/'); // 开始部分 $parRight = preg_quote('
', '/'); // 结束部分 $par = '/' . $parLeft . '(.*)' . $parRight . '/isU'; // 匹配中间的内容 $ArrAdd = array(); preg_match_all($par, $html, $ArrAdd); print_r($ArrAdd);
抓取天气信息
ini_set('pcre.backtrack_limit', 1000000); // 默认值是100000 $html = file_get_contents('http://www.weather.com.cn/weather/101200101.shtml'); $parLeft = preg_quote('', '/'); // 开始部分 $parRight = preg_quote('
', '/'); // 结束部分 $par = '/' . $parLeft . '(.*)' . $parRight . '/isU'; // 匹配中间的内容 $ArrAdd = array(); preg_match_all($par, $html, $ArrAdd); print_r($ArrAdd);
获取IP地址对应的地理位置
$ip = ($_SERVER['HTTP_VIA']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']; $ip = ($ip) ? $ip : $_SERVER['REMOTE_ADDR']; $ip = '122.82.231.128'; // 示例IP $html = file_get_contents('http://www.baidu.com/s?wd=' . $ip); $parleft = preg_quote('>来 自: ', '/'); $parright = preg_quote('', '/'); $par = '/' . $parleft . '(.*)' . $parright . '/i'; // 匹配中间的内容 $ArrAdd = array(); preg_match_all($par, $html, $ArrAdd); echo 'IP对应地址:' . $ArrAdd[1][0] . '
';