php正则应用:异常Delimiter must not be alphanumeric or backslash

大家好,我是专职Android研发,有14年研发经验,其中Android研发经验已经有10年。曾任职上市公司,有车机导航、机器人等行业及研发经验,热衷于技术和研发。除Android专业外,也研究并使用Python、PHP、JavaScript、前端、中间件、数据库等技术。

目前开始通过博客对自己的知识和经验进行归纳和总结,由于工作较忙,不定期去更新博客。希望本博客的内容能够真正帮助到一些同学。
个人博客:Dzboy的日志

咳咳,三年多不用php了,很多东西都忘记了,为了全栈,现在一点点拾起来,同时写下博客记录曾经走过的坑和现在正在走的坑。

问题:

出现问题的代码如下:

$content = request("http://pp.163.com/pp/searchpic/?q=%B7%E7%BE%B0");
$details = matchDetailInList($content);
var_dump($details);

function request($url) {
	$ch = curl_init($url);
	curl_setopt($ch, CURLOPT_HEADER, false);
	curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);//返回字符串而不是直接输出
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 页面发生301,302跳转

	$result = curl_exec($ch);
	curl_close($ch);
	return $result;
}

/**
 * 匹配列表页面中的详情页面地址
 */
function matchDetailInList($content) {
	//注意,这个在php中有问题
	$ruleMatchDetailInList = "http://*[^\"]*\.html[^\"]*";
	preg_match_all($ruleMatchDetailInList,$content,$result);  
    return $result;  
}

此代码执行时,出现以下异常:

Warning: preg_match_all(): Delimiter must not be alphanumeric or backslash in D:\wamp\www\curl\curlTest.php on line 29

在正则测试工具中完全没问题的,在php中出问题什么鬼?

看Warning中提示,可以看到是在说定界符不能是字母数字或反斜线。

定界符什么东西?这个是在preg中才有的,ereg中是没有的,这个定界符划定了正则表达式的开始和结尾。那就在前后两边加上定界符试试吧,既然说不能用字母数字或反斜线,那就用其他字符,比如#、~、/(当然,前后必须成双成对出现)

首先换成了#或者~

function matchDetailInList($content) {
	$ruleMatchDetailInList = "~http://*[^\"]*\.html[^\"]*~";
	preg_match_all($ruleMatchDetailInList,$content,$result);  
    return $result;  
}

果然成功,如下图
这里写图片描述

但是,当换成/斜线的时候

function matchDetailInList($content) {
	$ruleMatchDetailInList = "/http://*[^\"]*\.html[^\"]*/";
	preg_match_all($ruleMatchDetailInList,$content,$result);  
    return $result;  
}

又报错了。。。

Warning: preg_match_all(): Unknown modifier '/' in D:\wamp\www\curl\curlTest.php on line 29

如下图:
这里写图片描述

解决方案:

未知修饰符’/‘?还是正则中有问题!
这是由于正则中本身就有’/‘,看“http://”中的两个’//',跟定界符发生冲突了,加上反斜线,转义一下试试

function matchDetailInList($content) {
	$ruleMatchDetailInList = "/http:\/\/*[^\"]*\.html[^\"]*/";
	preg_match_all($ruleMatchDetailInList,$content,$result);  
    return $result;  
}

运行一下
这里写图片描述

果然没问题了!
所以,建议大家定界符使用的时候,尽量避免使用斜线/,避免和正则中的斜线冲突。

总结:
1、在php中,要有定界符
2、定界符尽量不要使用斜线/,而是使用#或者~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值