【问题标题】:use preg_split but keep delimiter使用 preg_split 但保留分隔符
【发布时间】:2015-08-24 14:14:14
【问题描述】:

我阅读了其他相关帖子,但无法使其适用于我的情况。

我有以下文字:

This. Is a test. I show. You.

我想使用 preg_split 使用 delimiter '。 '(点+空格),但我需要在返回的数组中保留分隔符。这是所需的结果:

array(
    '0' => 'This.',
    '1' => 'Is a test.',
    '2' => 'I show.',
    '3' => 'You.',
);  

我已经尝试过的:

preg_split("/(\.\s/)", $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

【问题讨论】:

    标签: php delimiter preg-split


    【解决方案1】:

    试试这个

    $matches = preg_split("/ (?=.)/", $text);
    var_dump( $matches);
    

    【讨论】:

      【解决方案2】:

      使用零宽度断言(此处为后视):

      $result = preg_split('~(?<=\.)\s~', $text, -1, PREG_SPLIT_NO_EMPTY);
      

      或者您可以使用\K 功能从整个匹配中删除左侧的所有内容:

      $result = preg_split('~\.\K\s~', $text, -1, PREG_SPLIT_NO_EMPTY);
      

      没有正则表达式(如果空格只是空格,并且最后一个点后面没有空格):

      $chunks = explode('. ', $text);
      $last = array_pop($chunks);
      $result = array_map(function ($i) { return $i . '.'; }, $chunks);
      $result[] = $last;
      

      或更好:

      $result = explode(' #&§', strtr($text, ['. '=>'. #&§']));
      

      【讨论】:

      • @nevermind:仔细看想要的结果,你会发现这里没有空格。
      • 是的,你是对的,但这让我很困惑:但我需要在返回的数组中保留分隔符?如果不需要空间,那就太好了。 :) +1,无论如何...
      • 我需要\K,但在右边:) 我找不到合适的字母,是什么?
      • @TomášVotruba:右边没有带有字母的转义序列。这样做的方法是将正确的部分包含在前瞻断言中:part_I_need(?=right_part) 或使用捕获组:(part_I_need)right_part。请注意,当您使用前瞻时,不会消耗正确的部分字符,并且可以在下一次匹配中重复使用。
      【解决方案3】:

      这不是正则表达式的解决方案,而是另一种变体。可能它也对你有用:

      $text = "This. Is a test. I show. You.";
      
      $result = explode('DELIM', str_replace('. ', '.DELIM', $text));
      

      【讨论】:

        【解决方案4】:

        使用preg_split() 等等

        $text="This. Is a test. I show. You.";
        $myVec=preg_split("/(\.\040)/", $text,-1,PREG_SPLIT_DELIM_CAPTURE);
        $j=0;
        for ($i = 0; $i < count($myVec); $i++) {
            if ($myVec[$i]!=". ") {
                $myNewVec[$j]=$myVec[$i];
            }else{
                $myNewVec[$j-1]=$myNewVec[$j-1].$myVec[$i];
            }
        $j++;
        }
        echo"<pre>";
        var_dump($myNewVec);
        echo "</pre>";
        

        【讨论】:

          猜你喜欢
          • 2018-04-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-01
          • 2012-01-08
          • 2020-08-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多