【问题标题】:Retain Delimiters when Splitting String拆分字符串时保留分隔符
【发布时间】:2010-05-20 17:40:20
【问题描述】:

编辑:好的,我无法阅读,感谢 Shrapnel 上校的帮助。如果有人来这里寻找相同的答案... print_r(preg_split('/([\!|\?|\.|\!\?])/', $string, null, PREG_SPLIT_DELIM_CAPTURE));

有没有什么办法可以在一组分隔符上拆分字符串,并在拆分后保留分隔符的位置和字符?

例如,使用 ! ? . !? 的分隔符来转:

$string = 'Hello. A question? How strange! Maybe even surreal!? Who knows.';

进入这个

array('Hello', '.', 'A question', '?', 'How strange', '!', 'Maybe even surreal', '!?', 'Who knows', '.');

目前我正在尝试使用print_r(preg_split('/([\!|\?|\.|\!\?])/', $string)); 将分隔符捕获为子模式,但我运气不佳。

【问题讨论】:

  • 为什么不阅读函数的手册页?可能有答案吗?虽然要将分隔符作为子模式捕获,但您可以使用 preg_match_all。但分裂肯定是最好的。只是养成先参考手册页的习惯
  • Erp.刚回到页面,我现在要去配镜师那里买一副眼镜:/我要失明了。谢谢你让我再看一遍:P
  • 请注意,您使用的是字符类。 [\!|\?|\.|\!\?] 表示 !|?. 中的任意一个字符。您可能想要的是:(!|\?|\.|!\?)。或者使用字符类:([?.]|!\??).

标签: php regex explode preg-split


【解决方案1】:

您的评论听起来像是您找到了相关标志,但您的正则表达式有点不对劲,所以我还是要添加这个:

preg_split('/(!\?|[!?.])/', $string, null, PREG_SPLIT_DELIM_CAPTURE);

请注意,这将在第一个字符串之后的每个字符串的开头留下空格,因此您可能还希望将它们全部通过trim() 运行。

结果:

$string = 'Hello. A question? How strange! Maybe even surreal!? Who knows.';
print_r(preg_split('/(!\?|[!?.])/', $string, null, PREG_SPLIT_DELIM_CAPTURE));

Array
(
    [0] => Hello
    [1] => .
    [2] =>  A question
    [3] => ?
    [4] =>  How strange
    [5] => !
    [6] =>  Maybe even surreal
    [7] => !?
    [8] =>  Who knows
    [9] => .
    [10] => 
)

【讨论】:

    【解决方案2】:

    只需将 PREG_SPLIT_DELIM_CAPTURE 添加到 preg_split 函数中:

    $str = 'Hello. A question? How strange!';
    $var = preg_split('/([!?.])/', $str, 0, PREG_SPLIT_DELIM_CAPTURE);
    $var = array(
        0 => "Hello",
        1 => ".",
        2 => " A question",
        3 => "?",
        4 => " How strange",
        5 => "!",
        6 => "",
    );
    

    【讨论】:

      【解决方案3】:

      您还可以在.!?!? 之后的空格上进行拆分。但这只能在你能保证这样一个字符后面有空格的情况下使用。

      您可以通过匹配 但带有正面回溯:(<=\.|!?|?|!):这使得正则表达式

      '/(?<=\.|\?|!) /'
      

      然后,您必须检查匹配的字符串是否以!? 结尾:如果是,则对最后两个进行子字符串化。如果没有,您必须对最后一个字符进行子串化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-23
        • 2016-11-26
        • 1970-01-01
        • 2022-11-03
        • 2013-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多