通过 PHP 或者其它语言如何快速判断字符串符合多个正则中某一条正则? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cokar
V2EX    PHP

通过 PHP 或者其它语言如何快速判断字符串符合多个正则中某一条正则?

  •  
  •   cokar 2022-11-12 23:07:38 +08:00 2570 次点击
    这是一个创建于 1064 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如我现在要判断用户输入的搜索词,如果输入的是 IP 我就直接返回 IP 归属地,输入运单号就直接显示物流信息,大概代码如下

    if(isIP()){ return 'IP 归属地'; }else if(isNum()){ return '返回物流信息'; }else if(isDomain()){ return '返回域名相关信息'; } 

    像这样的正判断可能有几百上千条,并且逐渐增多,总之我想用户输入关键字搜索就直接响应对应的自定义内容。

    但是一直 if else 判断感觉性能不行,如果正则越来越多肯定会更慢。 想请教各位大佬是否有更好的办法能更快速的判断呢?我主要使用 PHP 。

    12 条回复    2022-11-15 15:29:16 +08:00
    0ZXYDDu796nVCFxq
        1
    0ZXYDDu796nVCFxq  
       2022-11-12 23:37:54 +08:00 via Android
    正则必须匹配过才知道是否符合

    技术上还是有一些方法的,比如 JIT
    还有一个就是统计用户搜索频次,按数量调整正则顺序
    learningman
        2
    learningman  
       2022-11-13 00:08:58 +08:00 via Android
    你这等于是实现搜索引擎了,建议看看信息检索导论
    wudicgi
        3
    wudicgi  
       2022-11-13 00:11:14 +08:00
    正则有一个多模匹配就是做这个的,但不确定 PHP 里能不能用到
    ryanbuu
        4
    ryanbuu  
       2022-11-13 00:13:17 +08:00 via iPhone
    策略模式可以实现开闭原则
    sighforever
        5
    sighforever  
       2022-11-13 00:15:57 +08:00
    比较困难,这种估计没有普适的方案,只能自己研究一下现在的这些条件还有那些简单的特征可以分一下类,把复杂度变为 logn

    另外话说回来,几千条正则匹配,没有那种极端情况,也不会很慢的,而且正则匹配是纯 CPU 操作,扩展性还是很好的
    eason1874
        7
    eason1874  
       2022-11-13 00:33:41 +08:00
    PHP 正则匹配可以传入数组的, 一组匹配规则,对应一组处理函数,代码管理比 if 方便很多,效率有没提高就不知道了
    skys215
        8
    skys215  
       2022-11-13 09:48:38 +08:00
    运行一下正则,能匹配上的就是符合的正则
    MIUIOS
        9
    MIUIOS  
       2022-11-13 10:19:28 +08:00
    你这个策略模式就能解决啊, 去看下策略模式就知道了 ,还有不判断怎么知道用户输入的是啥呢
    silverwzw
        10
    silverwzw  
       2022-11-13 13:53:17 +08:00
    Google 的 C++库实现了这个功能(具体是 RE2::Set ),PHP 里有没有对应的实现就不知道了。具体原理是把多个正则表达式编译成一整个大的 DFA 或者 NFA ,然后输入在这个 DFA/NFA 上跑一边,看看最后自动机停在哪里就知道对应匹配了哪一个 /哪几个表达式。如果你正则表达式多,而且重复的部分多,可以大大提升效率。
    lietxia
        11
    lietxia  
       2022-11-13 16:48:14 +08:00
    判断交给前端 JS 。后端不做辨别。压力给到访问者就行了
    cokar
        12
    cokar  
    OP
       2022-11-15 15:29:16 +08:00 via Android
    感谢各位大佬的指导
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     895 人在线   最高记录 6679       Select Languge
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 19:43 PVG 03:43 LAX 12:43 JFK 15:43
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86