头疼的正则,大虾指教! preg_match_all("'<\s*a\s.*?href\s*=\s*([\"\'])?(?(l)(.*?)\\1|([^\s\>]+))'isx",$document,$links);我知道是用来批评链接的,但是怎么理解啊?哪位给讲讲?小弟先行谢过了! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 preg_match_all("' <\s*a\s.*?href\s*=\s*([\"\'])?(?(l)(.*?)\\1|([^\s\>]+))'isx",$document,$links); 这个写得有点问题,首先a肯定是挨着<的,<a 其实你看一下正则,这个不难懂的。 ?(?(l)(.*?)\\1|([^\s\>]+))'isx这里往后就看不懂了 不一定啊 < a href= abc.html>abc</a>我也可以这么写啊 这是 php-snoopy那个类里面的一行,怎么可能不行! (?(存在某个捕获组)正则式1|正则式2) : 意思是存在某个捕获组,就用正则式1,否则用正则式2([\"\'])?(?(l)(.*?)\\1|([^\s\>]+))意思就是如果捕获到单引号或者双引号,就用匹配式(.*?)\\1,否则用匹配式([^\s\>]+).因为([\"\'])用括号括起来了,所以一旦捕获,就是捕获组1,你可以\\1这样去后向引用它,(?(1)..|..)中的?(1)就是判断是否匹配到了双引号或者单引号,意思相当于程序语言中的if(isExist(\\1))。 简化下例子,可以帮助理解。//只匹配href='任意字符'(单引号) 和 href=数字$str = "href='123' href='abc' href=456 href=\"abc\" href=cde";preg_match_all("/href=(\')?(?(1)(.*?)\\1|([0-9]+))/is",$str,$links); ' <\s*a\s.*?href\s*=\s*([\"\'])?(?(l)(.*?)\\1|([^\s\>]+))'isx那我简单的说一下哪,照我的理解,首先后面的i是不分大小写,sx我就不知道了,你自己找找吧,< 零个或者一个空格 a 一个空格 任意个字符 href 0或者N个空格 = 0或者N个空格 '或者" 零个或者一个 任意字符 或者 '或者" 或者匹配 N个空格 结束符 大致就这些了,这个也挺不好讲的,一般只是个人意会。 这下全明白了,多谢了!还有我想取得<a href=abc.html>abc</a>这样的结果:abc.html=>abc 就是链接和锚文本都取出来,该怎么办呢? 8楼高手也,想不到正则也可以讲得这么清楚,自叹不如啊! 如果你想取,你只需要把href=abc.html取出来,然后用=分开就可以了。用把这些放在()里面可以捕获到. trypreg_match_all("'<\s*a\s.*?href\s*=\s*([\"\'])?(?(1)(.*?)\\1|([^\s\>]+))[^>]*?>(.*?)</a>'isx" ,"<a href='123456'>aaa</a><a href='234567'>bbb</a><a href=111111>ccc</a>" ,$links); print_r($links); 实现啦!简直太佩服了,正则都可以解释的这么清楚!再次感谢!我是个刚学PHP不到一年的小鸟,看了还有很多要学的啊 呵呵,最好多多测试,匹配html一旦忽略了某个因素,就很可能匹配不到。 问题又出现了,招这个写法,如果我匹配这段的话:<a href= 1111.html target=_blank>111</a><a href=' 2222.html' target=_blank>222</a><a href=" 3333.html" target=_blank>333</a><a href=444.html>444</a><a href="555.html" >555</a>< a href=666.html >666</a>就会得到这样的结果:2222.html==》1113333.html==》222555.html==》3331111.html==》444444.html==》555666.html==》666不是对应的,怎么处理呢? 如何在带链接的字上显示小窗口,当鼠标移到字上面的时候 缓存成什么格式的文件效率高 请问php如何返回一个xml对象呢? php中把session清空 静态生成问题 想做个下载附件的功能,如何实现弹出下载提示框?文本、图片的都不要直接打开 写PHP1年多,接下去我该怎么办? 求助一个简单的问题!!!! 我是PHP菜鸟~~~^@^ redhatlinux8.0 的apache,怎么加载php? mysql,与sqlserver同时在一台机器上运行会不会出现不兼容的情况。 中国的IP地址段是多少? php中echo href变量,链接到相关的页面
这个写得有点问题,首先a肯定是挨着<的,<a 其实你看一下正则,这个不难懂的。
这里往后就看不懂了
< a href= abc.html>abc</a>我也可以这么写啊
意思就是如果捕获到单引号或者双引号,就用匹配式(.*?)\\1,否则用匹配式([^\s\>]+).
因为([\"\'])用括号括起来了,所以一旦捕获,就是捕获组1,你可以\\1这样去后向引用它,(?(1)..|..)中的?(1)就是判断是否匹配到了双引号或者单引号,意思相当于程序语言中的if(isExist(\\1))。
//只匹配href='任意字符'(单引号) 和 href=数字
$str = "href='123' href='abc' href=456 href=\"abc\" href=cde";
preg_match_all("/href=(\')?(?(1)(.*?)\\1|([0-9]+))/is",$str,$links);
那我简单的说一下哪,照我的理解,首先后面的i是不分大小写,sx我就不知道了,你自己找找吧,
< 零个或者一个空格 a 一个空格 任意个字符 href 0或者N个空格 = 0或者N个空格 '或者" 零个或者一个
任意字符 或者 '或者" 或者匹配 N个空格 结束符 大致就这些了,这个也挺不好讲的,一般只是个人意会。
还有我想取得<a href=abc.html>abc</a>
这样的结果:abc.html=>abc 就是链接和锚文本都取出来,该怎么办呢?
preg_match_all("'<\s*a\s.*?href\s*=\s*([\"\'])?(?(1)(.*?)\\1|([^\s\>]+))[^>]*?>(.*?)</a>'isx"
,"<a href='123456'>aaa</a><a href='234567'>bbb</a><a href=111111>ccc</a>"
,$links);
print_r($links);
我是个刚学PHP不到一年的小鸟,看了还有很多要学的啊
<a href= 1111.html target=_blank>111</a>
<a href=' 2222.html' target=_blank>222</a>
<a href=" 3333.html" target=_blank>333</a>
<a href=444.html>444</a>
<a href="555.html" >555</a>
< a href=666.html >666</a>
就会得到这样的结果:
2222.html==》111
3333.html==》222
555.html==》333
1111.html==》444
444.html==》555
666.html==》666
不是对应的,怎么处理呢?