一个字符串拆分问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mantis
V2EX    PHP

一个字符串拆分问题

  •  
  •   mantis 2022-09-13 15:59:41 +08:00 3424 次点击
    这是一个创建于 1124 天前的主题,其中的信息可能已经有所发展或是发生改变。

    字符串拆分问题:

    有如下字符串:

    你关注的杨幂有 10 个未看 

    有如下关键字:

    ["杨幂", 10] 

    将字符串按关键字拆分为数组:

    ["你关注的", "杨幂", "有", 10, "个未看"] 

    该怎么解决?

    22 条回复    2022-09-14 16:24:41 +08:00
    Kinnice
        1
    Kinnice  
       2022-09-13 16:03:26 +08:00
    preg_split
    leoQaQ
        2
    leoQaQ  
       2022-09-13 16:07:22 +08:00
    1. 先用"杨幂"去拆分数组,得到 ["你关注的","有 10 个未看"];
    2. 把"杨幂" 插入数组,得到["你关注的","杨幂","有 10 个未看"];
    3. 再用第二个关键字"10" 去拆分新数组的后一个元素, 得到["有","个未看"];
    4. 把"10" 插入数组,然后就没有然后了
    2kCS5c0b0ITXE5k2
        3
    2kCS5c0b0ITXE5k2  
       2022-09-13 16:07:41 +08:00
    正则
    crayygy
        4
    crayygy  
       2022-09-13 16:10:27 +08:00
    jieba ?
    Kinnice
        5
    Kinnice  
       2022-09-13 16:12:49 +08:00
    <?php
    $arr = preg_split("/(10|杨幂)/","你关注的杨幂有 10 个未看", -1, PREG_SPLIT_DELIM_CAPTURE);
    print_r ($arr);
    ?>
    Jooooooooo
        6
    Jooooooooo  
       2022-09-13 16:17:54 +08:00
    边缘的 case 如果要拆分 "杨幂" 和 "幂有" 结果是啥?
    eason1874
        7
    eason1874  
       2022-09-13 16:23:11 +08:00
    1 、像 #5 那样用正则
    2 、先用 str_replace 在关键词前后插入分隔符,再用 explode 分割成数组

    数量大的话,两种都试试,有些场景第二种比较快
    ipwx
        8
    ipwx  
       2022-09-13 16:25:45 +08:00   2
    楼主的原问题是什么。

    总觉得又是个 XY problem
    lmshl
        9
    lmshl  
       2022-09-13 16:27:44 +08:00   1
    先确定下你这是不是一个 NLP 需求
    lmshl
        10
    lmshl  
       2022-09-13 16:29:37 +08:00
    sadfQED2
        11
    sadfQED2  
       2022-09-13 16:45:10 +08:00 via Android
    你原问题是啥?看你样子似乎是需要做中文分词?
    cydian
        12
    cydian  
       2022-09-13 16:45:58 +08:00
    @lmshl 这是啥网站或工具?
    lmshl
        13
    lmshl  
       2022-09-13 17:08:04 +08:00   1
    PythonYXY
        14
    PythonYXY  
       2022-09-13 17:13:47 +08:00
    构建一个有限状态自动机即可
    asLw0P981N0M0TCC
        15
    asLw0P981N0M0TCC  
       2022-09-13 17:16:24 +08:00
    怎么和百度搜索 关键词标红有点像
    air8712
        16
    air8712  
       2022-09-13 17:40:11 +08:00
    字典树
    haolongsun
        17
    haolongsun  
       2022-09-13 20:44:47 +08:00
    不确定的句子->词法分析,直接上 NLP
    固定的句子,就像你这个只有关键词是可变的,那么直接正则就 ok
    cowcomic
        19
    cowcomic  
       2022-09-13 22:16:04 +08:00
    词表有多大?
    如果词表很大,百以上,可以上一些 NLP 技术,比如 Trie 树,做词表扫描,再根据扫描结果分割
    如果词表不大,几十以内,for 循环和正则都可以
    fkdog
        20
    fkdog  
       2022-09-13 22:48:05 +08:00
    楼主问的是全文检索里用的分词,还是说希望将一个字符串按照指定关键词分割开来?
    jinliming2
        21
    jinliming2  
       2022-09-14 00:27:05 +08:00
    <?php
    $arr = preg_split("/(?<=^你关注的|有\\s)(?:\\B|\\b)|(?:\\B|\\b)(?=(?:有\\s\\d+)?\\s 个未看)/", "你关注的杨幂有 10 个未看");
    print_r ($arr);

    $arr2 = preg_split("/(你关注的)(\S+)(有)\s*(\d+)\s*(个未看)/", "你关注的杨幂有 10 个未看", -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
    print_r ($arr2);
    xupefei
        22
    xupefei  
       2022-09-14 16:24:41 +08:00
    AC 自动机
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1203 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 17:28 PVG 01:28 LAX 10:28 JFK 13:28
    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