【问题标题】:How do I include the split delimiter in results for preg_split()?如何在 preg_split() 的结果中包含拆分分隔符?
【发布时间】:2012-08-01 11:42:27
【问题描述】:

我有一个将文本分成句点的简单模式:

$text = preg_split("/[\.:!\?]+/", $text);

但我想在数组项的末尾包含. :!

也就是说,现在是“good:news.everyone!”我有:

array("good", "news", "everyone", "");

但我想要:

array("good:", "news.", "everyone!", "");

【问题讨论】:

    标签: php preg-split


    【解决方案1】:

    给你:

    preg_split('/([^.:!?]+[.:!?]+)/', 'good:news.everyone!', -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
    

    它是如何工作的:该模式实际上将所有内容都变成了分隔符。然后,要将这些分隔符包含在数组中,您可以使用PREG_SPLIT_DELIM_CAPTURE 常量。这将返回一个数组,如:

    array (
        0 => '',
        1 => 'good:',
        2 => '',
        3 => 'news.',
        4 => '',
        5 => 'everyone!',
        6 => '',
    );
    

    要删除空值,请使用PREG_SPLIT_NO_EMPTY。要组合这些常量中的两个或多个,我们使用按位| 运算符。结果:

    array (
        0 => 'good:',
        1 => 'news.',
        2 => 'everyone!'
    );
    

    【讨论】:

    • 如果我需要用 : 将“good:”拆分为整个单词怎么办?我还可以添加 标签吗?所以我需要的是 Good:
    • @user1551496:那么你正在处理标记。使用解析器而不是正则表达式,因为regex can't handle markup well
    • @NinoŠkopac: [^.:!?]+ 贪婪匹配除.:!? 之外的所有字符一次或多次,下一个字符组贪婪匹配.:!? 一次或多次。这两个字符类是分组的,因为模式将它们包装在() 中,所以结果是匹配所有内容。但是,只要遇到一个或多个.:!?,匹配就会结束,并且下一个匹配被放在一个新组中,因此数组-> match,empty,match,empty...使用PREG_SPLIT_DELIM_CAPTURE,你确保用作分隔符的匹配项在数组中,PREG_SPLIT_NO_EMPTY 去掉了空位
    • 从本质上讲,字符串中的每个部分都是一个分隔符,并且您正在拆分空字符串。您忽略空字符串并要求 preg_split 为您提供匹配的分隔符,这就是 OP 所追求的
    【解决方案2】:

    如果您在模式中使用positive lookbehind,则PREG_SPLIT_DELIM_CAPTURE 没有用处。该函数将保留分隔符。

    $text = preg_split('/(?<=[.:!?])/', 'good:news.everyone!', 0, PREG_SPLIT_NO_EMPTY);
    

    如果你使用lookbehind,它只会寻找字符而不匹配它。所以,在preg_split()的情况下,函数不会丢弃该字符。

    结果没有PREG_SPLIT_NO_EMPTY标志:

    array (
        0 => 'good:',
        1 => 'news.',
        2 => 'everyone!',
        3 => ''
    );
    

    结果带有 PREG_SPLIT_NO_EMPTY标志:

    array (
        0 => 'good:',
        1 => 'news.',
        2 => 'everyone!'
    );
    

    您可以使用此PHP Online Function Tester 对其进行测试。

    【讨论】:

    • 您也可以使用带有 ?= 而不是 ?
    • @JonathandosSantos 这是个得心应手的人。谢谢!
    猜你喜欢
    • 2019-07-07
    • 2012-06-23
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 2014-02-08
    相关资源
    最近更新 更多