V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
world
V2EX  ›  正则表达式

正则匹配

  •  1
     
  •   world · 2015-04-14 13:36:31 +08:00 · 2548 次点击
    这是一个创建于 3509 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第 1 条附言  ·  2015-04-14 17:16:22 +08:00
    已解决,谢谢各位了,不胜感激!!
    20 条回复    2015-04-14 16:44:23 +08:00
    Septembers
        1
    Septembers  
       2015-04-14 13:49:16 +08:00
    @Livid @vCleaner This may be moved to /go/php
    gkiwi
        2
    gkiwi  
       2015-04-14 13:49:24 +08:00   ❤️ 1
    href="(.*?[^jpg])"
    ALeo
        3
    ALeo  
       2015-04-14 13:50:09 +08:00   ❤️ 1
    preg_match_all('/href="(.[^jpg]*?)"/',$content,$matches);
    gkiwi
        4
    gkiwi  
       2015-04-14 13:51:57 +08:00   ❤️ 1
    建议直接看看这个30分钟入门: http://www.jb51.net/tools/zhengze.html

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

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

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

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

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

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




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

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

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

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

    (?:(?!\.jpg).)* 这些符合条件的字符重复多次
    gkiwi
        17
    gkiwi  
       2015-04-14 15:41:03 +08:00
    @Arrowing 哈哈,确实如此. 下面@sneezry的估计是足足够用!
    iyaozhen
        18
    iyaozhen  
       2015-04-14 15:45:10 +08:00
    @sneezry 非常感谢,我好好学习下。看来以前的写的正则都是过家家呀。
    imn1
        19
    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
        20
    p1n3  
       2015-04-14 16:44:23 +08:00 via iPhone
    好像已经解决了。。
    在正则中用于判断某个子串是存在,可以使用下面的。
    零宽度正预测先行断言,零宽度正回顾后发断言,零宽度负预测先行断言,零宽度负回顾后发断言
    然后还可以前和后,才有4种情况。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5404 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 03:31 · PVG 11:31 · LAX 19:31 · JFK 22:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.