正则匹配

2015-04-14 13:36:31 +08:00
 world

preg_match_all('/href="(.*?)"/',$content,$matches);
默认是匹配所有href后缀类型(.com .html .jpg)
如何排除.jpg的后缀类型,求指点

2350 次点击
所在节点    正则表达式
20 条回复
Septembers
2015-04-14 13:49:16 +08:00
@Livid @vCleaner This may be moved to /go/php
gkiwi
2015-04-14 13:49:24 +08:00
href="(.*?[^jpg])"
ALeo
2015-04-14 13:50:09 +08:00
preg_match_all('/href="(.[^jpg]*?)"/',$content,$matches);
gkiwi
2015-04-14 13:51:57 +08:00
建议直接看看这个30分钟入门: http://www.jb51.net/tools/zhengze.html

正则是个小技巧,最好是花点时间学会,大概知道各种情况怎么处理,之后再遇见直接写或者看下手册都方便.
phx13ye
2015-04-14 13:53:39 +08:00
href=".*?\.(?!jpg).*?"
sneezry
2015-04-14 13:56:48 +08:00
[^jpg]把png也一起过滤了。

/href="((?:(?!\.jpg).)*)"/
iyaozhen
2015-04-14 13:57:27 +08:00
href="(.*?[^jpg])"

sneezry
2015-04-14 14:00:21 +08:00
@iyaozhen 'href="www.xxx.com/aa.png"'.match(/href="(.*?[^jpg])"/)
world
2015-04-14 14:01:12 +08:00
@sneezry
@iyaozhen
@phx13ye
@gkiwi
@ALeo
@gkiwi
谢谢各位了!
Arrowing
2015-04-14 14:01:28 +08:00
@gkiwi href="(.*?[^jpg])"这个的话,仅适用于当前小范围的问题,如果需要匹配的后缀最后一位字母是jpg其中一位,就不适用了。

稍微改了下:
href="(.*\.[^j][^p][^g])"
iyaozhen
2015-04-14 14:19:45 +08:00
@sneezry 额,是的。[^jpg] 不行,你那样才是对的。
endoffight
2015-04-14 14:19:50 +08:00
路上的少了个?非贪婪

href="/1.jpg.jpg.gif.jpg.gif" .gif"

就错了
qingh
2015-04-14 14:25:17 +08:00
/^((?!.*?\.jpg).+)/
iyaozhen
2015-04-14 15:07:34 +08:00
@sneezry 大神,能否简单说明下,为什么要那么写。
感觉 (?!jpg) 就够了,这个意思不是向前查找但不匹配 "jpg" 吗?但结果和想象中的不一样。




还有 (?:(?!\.jpg).)* 中的 .)* 这里怎么理解。
sumhat
2015-04-14 15:26:02 +08:00
/href=".*(?<!\.jpg)"/
sneezry
2015-04-14 15:29:50 +08:00
@iyaozhen ?!不匹配内容,只是给出位置,和^、$、\b类似的。

(?!\.jpg) 找出后面跟着的不是.jpg的位置

(?!\.jpg). 找出后面跟着的不是.jpg的任意字符

(?:(?!\.jpg).) 不要给找出符合条件的任意字符分配组号,因为我们不想单独提取它们

(?:(?!\.jpg).)* 这些符合条件的字符重复多次
gkiwi
2015-04-14 15:41:03 +08:00
@Arrowing 哈哈,确实如此. 下面@sneezry的估计是足足够用!
iyaozhen
2015-04-14 15:45:10 +08:00
@sneezry 非常感谢,我好好学习下。看来以前的写的正则都是过家家呀。
imn1
2015-04-14 16:17:10 +08:00
本以为很简单的问题,没想到你还问了两帖~
还是根据具体应用写吧,想一条通用涵盖是比较难的

(?:(?!ABC).)* 这种写法简单讲适用于一段字串中不含有“ABC”这个子串,不论ABC位置在哪
@sneezry 已经做了说明

但不同网站很难归一,有些是xxx.jpg,有些是xxx.jpg.html,有些是xxx.html都指向一个图片,所以一个正则面向一个或类似网站比较好

另外提醒一下,仅用 href 也可能匹配到 js 或其他,最好把标签也带上
<a [^>]*href=['"]……
p1n3
2015-04-14 16:44:23 +08:00
好像已经解决了。。
在正则中用于判断某个子串是存在,可以使用下面的。
零宽度正预测先行断言,零宽度正回顾后发断言,零宽度负预测先行断言,零宽度负回顾后发断言
然后还可以前和后,才有4种情况。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/183617

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX