php中的多个分隔符爆炸

Posted

技术标签:

【中文标题】php中的多个分隔符爆炸【英文标题】:Php multiple delimiters in explode [duplicate] 【发布时间】: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;

【问题讨论】:

我从未见过有人回答“这个怎么样”、“那个怎么样”这样的问题 【参考方案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 爆炸的部分与一个空格粘合在一起,然后再次将其分开,这次将空格带走。

【讨论】:

以上是关于php中的多个分隔符爆炸的主要内容,如果未能解决你的问题,请参考以下文章

php爆炸:使用空格分隔符将字符串拆分为单词

PHP implode 爆炸逗号分隔值用于 if else 语句

以空格为分隔符的爆炸数组并将值推送到新数组

gdb中的多个命令由某种分隔符';'分隔?

BackSlash(\),PHP 中命名空间别名中的命名空间分隔符

php如何将逗号分隔的多个json格式的字符串作为一个值插入到mysql表中? [复制]