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 implode 爆炸逗号分隔值用于 if else 语句