PHP多个分隔符爆炸


146

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

$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;
}

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

Answers:


290

怎么使用

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

惊人。我想知道这是如何反对explode()单一论点的
Ascherer

6
没关系,如果您想使用硬字符串解析来制作大型系统,最有效的方法就是使用自己的解析器。否则,它对系统速度没有太大影响,但是您倾向于使用最简单的方法(以节省金钱)
SergeS 2013年

9
请注意,有些字符需要转义才能工作(例如/?)。例如:preg_split("/(\/|\?|=)/", $foo);
kenorb 2015年

preg_split返回索引数组。有可能返回联想?例如$str='/x/1/2/3/4/5/y/100/200/z/777'; preg_split("/(x|y|z|)/", $str); ,看看array('x'=>'1/2/3/4/5', 'y'=>'100/200', 'z'=>'777')
LINKeRxUA

2
我发现在/ (和之间) /停止了preg_split的工作。我不得不删除空格,然后按预期方式运行(使用PHP 7)
Boardy

69

你可以把第一个字符串,替换所有@vs使用str_replace,然后发生爆炸vs反之亦然或副。


1
简单的解决方案,最终将它用于Json代码,用“ |”替换“}}”。肮脏但高效:)!
Baldráni

5
天才:D
Deadpool'Dec

当一个定界符是另一个定界符(例如(@|@!)大小写)的超集时,此操作将无法正常工作

2
@vaxquis是的。str_replace('@!','@',$ str); 确保从最独特的分隔符开始。
约翰·巴林格

@JohnBallinger不,这不会-您提出了另一个解决方案,该解决方案明确表明原始解决方案无法正常工作,并且您的想法有缺陷。想象一下,您不知道哪个是另一个的超集。您必须创建另一行代码来检查该问题等。尽管我通常讨厌正则表达式,但就可维护性和简单性而言,这是最佳解决方案,这是一种情况。

47
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.net上的php @ metehanarslan


14

如何用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)
                )
            )
        )
    );
}

我猜这有点难以理解,但是我在这里进行了测试。

一线!


11

不会strtok()为您工作吗?


1
看到他的定界符是“ vs”,这可能不起作用,如php docu所说:strtok()将字符串(str)拆分为较小的字符串(令牌),每个令牌都由令牌中的任何字符定界。和“ vs”包含两个字符
mikewasmike 2015年

1
如果您提供了解释或示例,这将是一个更好的答案。实际上,它更像是一条评论……
billynoah 18'Aug



2

我这样做

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);
}

这就是我想要的
Manojkiran.'Apr

2

这个怎么样?

/**
 * 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或更高版本。

你可以在这里测试


1

使用这种分离方法会遇到一些问题(例如,如果有此字符串:“ vs @ apples”),但是如果我们首先说明您已经考虑过并解决了所有可能的冲突,你可以只更换出现的所有$delimiter[1]$delimiter[n]$delimiter[0],然后对第一个分裂?


1

如果分隔符仅是字符,则可以使用strtok,这似乎更合适。请注意,必须将其与while循环配合使用才能实现效果。


0

这将起作用:

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

如您所见,它首先将爆炸的零件与一个空间粘合在一起,然后将其再次切开,这次将空间与他一起。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.