【问题标题】:Php multiple delimiters in explode [duplicate]php中的多个分隔符爆炸
【发布时间】:2011-06-24 17:38:36
【问题描述】:

我有一个问题,我有一个字符串数组,我想在不同的分隔符中爆炸。例如

$example = 'Appel @ Ratte';
$example2 = 'apple vs ratte'

我需要一个在 @ 或 vs. 中爆炸的数组

我已经写了一个解决方案,但是如果大家有更好的解决方案,请在这里发布。

private function multiExplode($delimiters,$string) {
    $ary = explode($delimiters[0],$string);
    array_shift($delimiters);
    if($delimiters != NULL) {
        if(count($ary) <2)                      
            $ary = $this->multiExplode($delimiters, $string);
    }
    return  $ary;
}

【问题讨论】:

  • 我从未见过有人回答“这个怎么样”、“那个怎么样”这样的问题

标签: php explode


【解决方案1】:

尝试使用:

$output = preg_split('/ (@|vs) /', $input);

【讨论】:

  • 太棒了。我想知道这如何在单个参数上与 explode() 相提并论
  • 没关系,如果你想用硬字符串解析做大系统,最有效的方法是自己的解析器。否则它对系统速度没有太大影响,但您更喜欢使用最简单的方法(为了省钱)
  • 请注意,有些字符需要转义才能工作(例如/?)。例如:preg_split("/(\/|\?|=)/", $foo);.
  • 我发现 / () / 之间的空格阻止了 preg_split 的工作。我必须删除空格,然后它按预期工作(使用 PHP 7)
  • 空格是为了将“vs”作为单独的字符串与“vs”作为某些(可能很奇怪)单词的一部分进行区分 - 尝试用 \s 替换空格
【解决方案2】:

您可以取第一个字符串,使用str_replace 将所有@ 替换为vs,然后在vs 上爆炸,反之亦然。

【讨论】:

  • 简单的解决方案,最终将它用于 Json 代码,将“}}”替换为“|”。肮脏但高效:)!
  • 真是个天才:D
  • 当一个分隔符是另一个分隔符的超集时(例如(@|@!) case),这将无法正常工作
  • @vaxquis 是的,它会的。 str_replace('@!', '@',$str);确保从最独特的分隔符开始。
  • @vaxquis - 虽然你提出了一个很好的观点,但应该注意的是,即使使用preg_split(),你提到的案例也总会存在问题。考虑preg_split('/(@|@!)/','A@B@!C')preg_split('/(@!|@)/','A@B@!C') 的输出差异。分隔符的顺序会改变结果。只要您注意定界符数组的排序方式,John 的解决方案的性能就会一样好。
【解决方案3】:
function multiexplode ($delimiters,$string) {

    $ready = str_replace($delimiters, $delimiters[0], $string);
    $launch = explode($delimiters[0], $ready);
    return  $launch;
}

$text = "here is a sample: this text, and this will be exploded. this also | this one too :)";


$exploded = multiexplode(array(",",".","|",":"),$text);

print_r($exploded);

//And output will be like this:
// Array
// (
//    [0] => here is a sample
//    [1] =>  this text
//    [2] =>  and this will be exploded
//    [3] =>  this also 
//    [4] =>  this one too 
//    [5] => )
// )

来源:php@metehanarslan at php.net

【讨论】:

    【解决方案4】:

    如何使用strtr() 将所有其他分隔符替换为第一个分隔符?

    private function multiExplode($delimiters,$string) {
        return explode(
            $delimiters[0],
            strtr(
                $string,
                array_combine(
                    array_slice(    $delimiters, 1  ),
                    array_fill(
                        0,
                        count($delimiters)-1,
                        array_shift($delimiters)
                    )
                )
            )
        );
    }
    

    我猜这有点不可读,但我在这里测试过它。

    单线ftw!

    【讨论】:

      【解决方案5】:

      strtok() 不适合你吗?

      【讨论】:

      • 看到他的分隔符是 'vs',这可能不像 php docu 所说的那样工作:strtok() 将字符串 (str) 拆分为更小的字符串(标记),每个标记由令牌。 'vs' 包含两个字符
      • 如果您包含解释或示例,这将是一个更好的答案。事实上,它更像是一种评论......
      【解决方案6】:

      只需使用以下代码即可:

      $arr=explode('sep1',str_replace(array('sep2','sep3','sep4'),'sep1',$mystring));
      

      【讨论】:

        【解决方案7】:

        你可以试试这个解决方案....效果很好

        function explodeX( $delimiters, $string )
        {
            return explode( chr( 1 ), str_replace( $delimiters, chr( 1 ), $string ) );
        }
        $list = 'Thing 1&Thing 2,Thing 3|Thing 4';
        
        $exploded = explodeX( array('&', ',', '|' ), $list );
        
        echo '<pre>';
        print_r($exploded);
        echo '</pre>';
        

        来源:http://www.phpdevtips.com/2011/07/exploding-a-string-using-multiple-delimiters-using-php/

        【讨论】:

        • 简洁利落
        【解决方案8】:

        这个怎么样?

        /**
         * Like explode with multiple delimiters. 
         * Default delimiters are: \ | / and ,
         *
         * @param string $string String that thould be converted to an array.
         * @param mixed $delimiters Every single char will be interpreted as an delimiter. If a delimiter with multiple chars is needed, use an Array.
         * @return array. If $string is empty OR not a string, return false
         */
        public static function multiExplode($string, $delimiters = '\\|/,') 
        {
          $delimiterArray = is_array($delimiters)?$delimiters:str_split($delimiters);
          $newRegex = implode('|', array_map (function($delimiter) {return preg_quote($delimiter, '/');}, $delimiterArray));
          return is_string($string) && !empty($string) ? array_map('trim', preg_split('/('.$newRegex.')/', $string, -1, PREG_SPLIT_NO_EMPTY)) : false;
        }
        

        在您的情况下,您应该为 $delimiters 参数使用数组。然后可以使用多个字符作为一个分隔符。

        如果您不关心结果中的尾随空格,可以删除返回行中的 array_map('trim', [...] ) 部分。 (但在这种情况下不要吹毛求疵。将preg_split 保留在其中。)

        所需的 PHP 版本:5.3.0 或更高版本。

        你可以测试一下here

        【讨论】:

          【解决方案9】:

          我是这样做的……

          public static function multiExplode($delims, $string, $special = '|||') {
          
              if (is_array($delims) == false) {
                  $delims = array($delims);
              }
          
              if (empty($delims) == false) {
                  foreach ($delims as $d) {
                      $string = str_replace($d, $special, $string);
                  }
              }
          
              return explode($special, $string);
          }
          

          【讨论】:

          • 这就是我要找的
          【解决方案10】:

          使用这种分离方法你会遇到一些问题(如果你有这个字符串:“vs @apples”)可能的冲突,您可以将所有出现的$delimiter[1] 替换为$delimiter[n]$delimiter[0],然后拆分第一个?

          【讨论】:

            【解决方案11】:

            如果你的分隔符只有字符,你可以使用strtok,这似乎更适合这里。请注意,您必须将其与while 循环一起使用才能达到效果。

            【讨论】:

              【解决方案12】:

              这将起作用:

              $stringToSplit = 'This is my String!' ."\n\r". 'Second Line';
              $split = explode (
                ' ', implode (
                  ' ', explode (
                    "\n\r", $stringToSplit
                  )
                )
              );
              

              如你所见,它首先将由 \n\r 爆炸的部分与一个空格粘合在一起,然后再次将其分开,这次将空格带走。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-09-12
                • 2011-02-21
                • 2020-12-13
                • 2016-12-04
                相关资源
                最近更新 更多