头疼的正则,大虾指教!

Bandit_feng 2009-10-27 03:50:35
preg_match_all("'<\s*a\s.*?href\s*=\s*([\"\'])?(?(l)(.*?)\\1|([^\s\>]+))'isx",$document,$links);
我知道是用来批评链接的,但是怎么理解啊?哪位给讲讲?
小弟先行谢过了!
...全文
109 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bandit_feng 2009-10-27
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 foolbirdflyfirst 的回复:]
引用 16 楼 bandit_feng 的回复:
引用 14 楼 foolbirdflyfirst 的回复:
这下全明白了,多谢了!
还有我想取得  <a href=abc.html>abc  </a>
这样的结果:abc.html=>abc 就是链接和锚文本都取出来,该怎么办呢?

try
PHP codepreg_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);
[/Quote]
问题又出现了,招这个写法,如果我匹配这段的话:
<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
不是对应的,怎么处理呢?
Bandit_feng 2009-10-27
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 foolbirdflyfirst 的回复:]
引用 16 楼 bandit_feng 的回复:
引用 14 楼 foolbirdflyfirst 的回复:
这下全明白了,多谢了!
还有我想取得  <a href=abc.html>abc  </a>
这样的结果:abc.html=>abc 就是链接和锚文本都取出来,该怎么办呢?

try
PHP codepreg_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一旦忽略了某个因素,就很可能匹配不到。
[/Quote]
好的
cayleung 2009-10-27
  • 打赏
  • 举报
回复
围观一下~~
dehong 2009-10-27
  • 打赏
  • 举报
回复
我也觉得正则让人头大。
foolbirdflyfirst 2009-10-27
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 bandit_feng 的回复:]
引用 14 楼 foolbirdflyfirst 的回复:
这下全明白了,多谢了!
还有我想取得 <a href=abc.html>abc </a>
这样的结果:abc.html=>abc 就是链接和锚文本都取出来,该怎么办呢?

try
PHP codepreg_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不到一年的小鸟,看了还有很多要学的啊
[/Quote]
呵呵,最好多多测试,匹配html一旦忽略了某个因素,就很可能匹配不到。
Bandit_feng 2009-10-27
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 foolbirdflyfirst 的回复:]
这下全明白了,多谢了!
还有我想取得 <a href=abc.html>abc </a>
这样的结果:abc.html=>abc 就是链接和锚文本都取出来,该怎么办呢?

try
PHP codepreg_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);
[/Quote]
实现啦!简直太佩服了,正则都可以解释的这么清楚!再次感谢!
我是个刚学PHP不到一年的小鸟,看了还有很多要学的啊
Bandit_feng 2009-10-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 askzhigang 的回复:]
8楼高手也,想不到正则也可以讲得这么清楚,自叹不如啊! 如果你想取,你只需要把href=abc.html取出来,然后用=分开就可以了。用把这些放在()里面可以捕获到.
[/Quote]
不用那么麻烦吧
foolbirdflyfirst 2009-10-27
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 bandit_feng 的回复:]
引用 8 楼 foolbirdflyfirst 的回复:
引用 4 楼 bandit_feng 的回复:
引用 2 楼 zhoupuyue 的回复:
你什么地方看不明白?

?(?(l)(.*?)\\1|([^\s\>]+))'isx
这里往后就看不懂了

(?(存在某个捕获组)正则式1|正则式2) : 意思是存在某个捕获组,就用正则式1,否则用正则式2

([\"\'])?(?(l)(.*?)\\1|([^\s\>]+))
意思就是如果捕获到单引号或者双引号,就用匹配式(.*?)\\1,否则用匹配式([^\s\>]+).
因为([\"\'])用括号括起来了,所以一旦捕获,就是捕获组1,你可以\\1这样去后向引用它,(?(1)..|..)中的?(1)就是判断是否匹配到了双引号或者单引号,意思相当于程序语言中的if(isExist(\\1))。


这下全明白了,多谢了!
还有我想取得 <a href=abc.html>abc </a>
这样的结果:abc.html=>abc 就是链接和锚文本都取出来,该怎么办呢?
[/Quote]
try
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);
总哈哈 2009-10-27
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 bandit_feng 的回复:]
引用 8 楼 foolbirdflyfirst 的回复:
引用 4 楼 bandit_feng 的回复:
引用 2 楼 zhoupuyue 的回复:
你什么地方看不明白?

?(?(l)(.*?)\\1|([^\s\>]+))'isx
这里往后就看不懂了

(?(存在某个捕获组)正则式1|正则式2) : 意思是存在某个捕获组,就用正则式1,否则用正则式2

([\"\'])?(?(l)(.*?)\\1|([^\s\>]+))
意思就是如果捕获到单引号或者双引号,就用匹配式(.*?)\\1,否则用匹配式([^\s\>]+).
因为([\"\'])用括号括起来了,所以一旦捕获,就是捕获组1,你可以\\1这样去后向引用它,(?(1)..|..)中的?(1)就是判断是否匹配到了双引号或者单引号,意思相当于程序语言中的if(isExist(\\1))。


这下全明白了,多谢了!
还有我想取得 <a href=abc.html>abc </a>
这样的结果:abc.html=>abc 就是链接和锚文本都取出来,该怎么办呢?
[/Quote]
8楼高手也,想不到正则也可以讲得这么清楚,自叹不如啊! 如果你想取,你只需要把href=abc.html取出来,然后用=分开就可以了。用把这些放在()里面可以捕获到.
阿_布 2009-10-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 foolbirdflyfirst 的回复:]
引用 4 楼 bandit_feng 的回复:
引用 2 楼 zhoupuyue 的回复:
你什么地方看不明白?

?(?(l)(.*?)\\1|([^\s\>]+))'isx
这里往后就看不懂了

(?(存在某个捕获组)正则式1|正则式2) : 意思是存在某个捕获组,就用正则式1,否则用正则式2

([\"\'])?(?(l)(.*?)\\1|([^\s\>]+))
意思就是如果捕获到单引号或者双引号,就用匹配式(.*?)\\1,否则用匹配式([^\s\>]+).
因为([\"\'])用括号括起来了,所以一旦捕获,就是捕获组1,你可以\\1这样去后向引用它,(?(1)..|..)中的?(1)就是判断是否匹配到了双引号或者单引号,意思相当于程序语言中的if(isExist(\\1))。



[/Quote]

学习。
Bandit_feng 2009-10-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 foolbirdflyfirst 的回复:]
引用 4 楼 bandit_feng 的回复:
引用 2 楼 zhoupuyue 的回复:
你什么地方看不明白?

?(?(l)(.*?)\\1|([^\s\>]+))'isx
这里往后就看不懂了

(?(存在某个捕获组)正则式1|正则式2) : 意思是存在某个捕获组,就用正则式1,否则用正则式2

([\"\'])?(?(l)(.*?)\\1|([^\s\>]+))
意思就是如果捕获到单引号或者双引号,就用匹配式(.*?)\\1,否则用匹配式([^\s\>]+).
因为([\"\'])用括号括起来了,所以一旦捕获,就是捕获组1,你可以\\1这样去后向引用它,(?(1)..|..)中的?(1)就是判断是否匹配到了双引号或者单引号,意思相当于程序语言中的if(isExist(\\1))。

[/Quote]
这下全明白了,多谢了!
还有我想取得<a href=abc.html>abc</a>
这样的结果:abc.html=>abc 就是链接和锚文本都取出来,该怎么办呢?
总哈哈 2009-10-27
  • 打赏
  • 举报
回复
' <\s*a\s.*?href\s*=\s*([\"\'])?(?(l)(.*?)\\1|([^\s\>]+))'isx
那我简单的说一下哪,照我的理解,首先后面的i是不分大小写,sx我就不知道了,你自己找找吧,
< 零个或者一个空格 a 一个空格 任意个字符 href 0或者N个空格 = 0或者N个空格 '或者" 零个或者一个
任意字符 或者 '或者" 或者匹配 N个空格 结束符 大致就这些了,这个也挺不好讲的,一般只是个人意会。
foolbirdflyfirst 2009-10-27
  • 打赏
  • 举报
回复
简化下例子,可以帮助理解。
//只匹配href='任意字符'(单引号) 和 href=数字
$str = "href='123' href='abc' href=456 href=\"abc\" href=cde";
preg_match_all("/href=(\')?(?(1)(.*?)\\1|([0-9]+))/is",$str,$links);
foolbirdflyfirst 2009-10-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bandit_feng 的回复:]
引用 2 楼 zhoupuyue 的回复:
你什么地方看不明白?

?(?(l)(.*?)\\1|([^\s\>]+))'isx
这里往后就看不懂了
[/Quote]
(?(存在某个捕获组)正则式1|正则式2) : 意思是存在某个捕获组,就用正则式1,否则用正则式2

([\"\'])?(?(l)(.*?)\\1|([^\s\>]+))
意思就是如果捕获到单引号或者双引号,就用匹配式(.*?)\\1,否则用匹配式([^\s\>]+).
因为([\"\'])用括号括起来了,所以一旦捕获,就是捕获组1,你可以\\1这样去后向引用它,(?(1)..|..)中的?(1)就是判断是否匹配到了双引号或者单引号,意思相当于程序语言中的if(isExist(\\1))。


Bandit_feng 2009-10-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 askzhigang 的回复:]
兄弟,你那正则不行,配不出来。我刚试过了。
[/Quote]
这是 php-snoopy那个类里面的一行,怎么可能不行!
总哈哈 2009-10-27
  • 打赏
  • 举报
回复
兄弟,你那正则不行,配不出来。我刚试过了。
Bandit_feng 2009-10-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 askzhigang 的回复:]
preg_match_all("' <\s*a\s.*?href\s*=\s*([\"\'])?(?(l)(.*?)\\1|([^\s\>]+))'isx",$document,$links);
这个写得有点问题,首先a肯定是挨着 <的, <a 其实你看一下正则,这个不难懂的。
[/Quote]
不一定啊
< a href= abc.html>abc</a>我也可以这么写啊
Bandit_feng 2009-10-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhoupuyue 的回复:]
你什么地方看不明白?
[/Quote]
?(?(l)(.*?)\\1|([^\s\>]+))'isx
这里往后就看不懂了
总哈哈 2009-10-27
  • 打赏
  • 举报
回复
preg_match_all("' <\s*a\s.*?href\s*=\s*([\"\'])?(?(l)(.*?)\\1|([^\s\>]+))'isx",$document,$links);
这个写得有点问题,首先a肯定是挨着<的,<a 其实你看一下正则,这个不难懂的。
阿_布 2009-10-27
  • 打赏
  • 举报
回复
你什么地方看不明白?
加载更多回复(1)

21,891

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧