Patlamada php çoklu sınırlayıcılar


146

Bir sorunum var, bir dize dizisi var ve farklı sınırlayıcıda patlamak istiyorum. Örneğin

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

ve @ veya vs.'de patlayan bir diziye ihtiyacım var

Zaten bir çözüm yazdım, ama eğer herkesin daha iyi bir çözümü varsa lütfen buraya gönderin.

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

İnsanlara "Buna ne dersiniz", "Buna ne dersiniz" gibi cevaplar veren bir soru görmedim
HosseyNJF

Yanıtlar:


290

kullanmaya ne dersin

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

İnanılmaz. bunun explode()tek argümanlara nasıl
meydan okuduğunu

6
Sorun değil, eğer sabit dize ayrıştırma ile büyük bir sistem yapmak istiyorsanız, en etkili yolu kendi ayrıştırıcı olduğunu. Oterwise sistem hızı üzerinde çok fazla etkisi yoktur, ancak sizin için en kolay yolu kullanmayı tercih edersiniz (Para etkili olmak için)
SergeS

9
Bazı karakterlerin (örneğin /, ?) çalışmak için kaçması gerektiğini unutmayın . Örneğin: preg_split("/(\/|\?|=)/", $foo);.
kenorb

preg_split dizinlenmiş diziyi döndürür. İlişkisel geri dönmek mümkün mü? Örneğin $str='/x/1/2/3/4/5/y/100/200/z/777'; preg_split("/(x|y|z|)/", $str); ve görmek içinarray('x'=>'1/2/3/4/5', 'y'=>'100/200', 'z'=>'777')
LINKeRxUA

2
Ben arasındaki boşluklara sahip bulundu / (ve ) /preg_split çalışmasını durdurdu. Boşlukları kaldırmak zorunda kaldım ve beklendiği gibi çalıştı (PHP 7 kullanarak)
Boardy

69

Sen, ilk dizeyi alan tüm yerini alabilir @ile vskullanarak str_replace, daha sonra patlayacak vstersi veya yardımcısı.


1
Kolay çözüm, "}}" yerine "|" yerine Json kodunu kullanarak sona erdi. Kirli ama verimli :)!
Baldráni

5
ne dahi: D
Deadpool

bir sınırlayıcı diğerinin üst (@|@!)

2
@ vaxquis Evet olacak. str_replace ('@!', '@', $ str); En benzersiz sınırlayıcı ile başladığınızdan emin olun.
John Ballinger

@JohnBallinger Hayır, olmaz - Eğer önerilen başka açıkça göstermektedir çözümü, orijinal çözüm olmaz düzgün çalışması ve fikrinizin kusurlu olduğunu. Hangisinin diğerinin süper yıldızı olduğunu bilmediğinizi düşünün. Bunu vb. Kontrol etmek için başka bir kod satırı oluşturmak gerekir. Genel olarak regexes nefret ederken, bu sürdürülebilirlik ve basitlik açısından en iyi çözüm olduğu bir durumdur.

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] => )
// )

Kaynak: php.net şirketinde php @ metehanarslan


14

strtr()Tüm diğer sınırlayıcılarınızı birincisiyle değiştirmek için kullanmaya ne dersiniz ?

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

Sanırım okunamıyor, ama burada çalıştığımı test ettim.

Tek gömlek ftw!


11

strtok()Senin için çalışmaz mıydı ?


1
sınırlayıcısının 'vs' olduğunu görmek, php docu'nun dediği gibi çalışmayabilir: strtok (), bir dizgiyi (str) daha küçük dizelere (jetonlar) böler; her jeton, jetondaki herhangi bir karakterle sınırlanır. ve 'vs' iki karakter içeriyor
mikewasmike

1
bir açıklama veya örnek eklerseniz bu daha iyi bir yanıt olacaktır. olduğu gibi, daha bir yorum ...
billynoah

8

Sadece aşağıdaki kodu kullanabilirsiniz:

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

4

Bu çözümü deneyebilirsiniz .... Harika çalışıyor

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>';

Kaynak: http://www.phpdevtips.com/2011/07/ patlayan-a-string-using-multiple-delimiters-using- php/


basit ve temiz
Manojkiran.A

2

Bu şekilde yaparım ...

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

aradığım şey buydu
Manojkiran.A

2

Buna ne dersin?

/**
 * 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;
}

Sizin durumunuzda $ delimiters parametresi için bir Array kullanmalısınız. Daha sonra bir sınırlayıcı olarak birden fazla karakter kullanmak mümkündür.

Sonuçlarınızdaki boşlukları önemsemiyorsanız array_map('trim', [...] ), dönüş satırındaki parçayı kaldırabilirsiniz . (Ama bu durumda titiz olmayın. İçinde saklayın preg_split.)

Gerekli PHP Sürümü: 5.3.0 veya üstü.

Burada test edebilirsiniz


1

Bu ayırma yöntemini kullanarak bazı sorunlar yaşayacaksınız (bu dizeye sahipseniz: "vs @ elmalar"), ancak bunu düşündüğünüzü ve olası tüm çarpışmaların giderildiğini belirterek, sadece tüm tekrarlarını yerini alabilir $delimiter[1]etmek $delimiter[n]ile $delimiter[0], ve daha sonra bu ilki bölünmüş?


1

Sınırlayıcınız yalnızca karakterler ise, strtokburada daha uygun gibi kullanabilirsiniz. whileEfektleri elde etmek için onu bir döngü ile kullanmanız gerektiğini unutmayın .


0

Bu çalışacak:

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

Gördüğünüz gibi, ilk önce by \ n \ r patlatılmış parçaları bir boşlukla birlikte yapıştırır, daha sonra tekrar kesmek için, bu kez onunla boşlukları alır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.