Beberapa pembatas php meledak


146

Saya punya masalah, saya punya array string, dan saya ingin meledak di pembatas yang berbeda. Sebagai contoh

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

dan saya membutuhkan array yang meledak di @ atau vs.

Saya sudah menulis solusi, tetapi Jika semua orang memiliki solusi yang lebih baik silakan posting di sini.

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

Saya tidak pernah melihat pertanyaan dengan orang yang memberikan jawaban seperti "Bagaimana dengan ini", "Bagaimana dengan itu"
HosseyNJF

Jawaban:


290

bagaimana dengan menggunakan

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

Luar biasa. Saya bertanya-tanya bagaimana hal ini bertentangan explode()dengan satu argumen
Ascherer

6
Tidak masalah, jika Anda ingin membuat sistem besar dengan parsing tali keras, cara yang paling efektif adalah parser sendiri. Jika tidak, ini tidak banyak berpengaruh pada kecepatan sistem, tetapi Anda lebih suka menggunakan cara termudah untuk Anda (Agar menjadi efektif uang)
SergeS

9
Perhatikan bahwa beberapa karakter harus dilepaskan agar berfungsi (seperti /, ?). Sebagai contoh: preg_split("/(\/|\?|=)/", $foo);.
kenorb

preg_split mengembalikan array yang diindeks. Apakah mungkin untuk mengembalikan asosiatif? Misalnya $str='/x/1/2/3/4/5/y/100/200/z/777'; preg_split("/(x|y|z|)/", $str); dan untuk melihatarray('x'=>'1/2/3/4/5', 'y'=>'100/200', 'z'=>'777')
LINKeRxUA

2
Saya menemukan memiliki ruang di antara / (dan ) /menghentikan preg_split agar tidak berfungsi. Saya harus menghapus spasi dan kemudian berfungsi seperti yang diharapkan (menggunakan PHP 7)
Boardy

69

Anda dapat mengambil string pertama, ganti semua @ dengan vsmenggunakan str_replace, lalu meledak vsatau sebaliknya.


1
Solusi mudah, akhirnya menggunakannya untuk kode Json untuk mengganti "}}" oleh "|". Kotor tapi efisien :)!
Baldráni

5
sungguh jenius: D
Deadpool

ini tidak akan berfungsi dengan baik ketika satu pembatas adalah superset dari yang lain (misalnya (@|@!)

2
@vaxquis Ya itu akan. str_replace ('@!', '@', $ str); Pastikan Anda mulai dengan pembatas paling unik.
John Ballinger

@ JohnBallinger Tidak, itu tidak akan - Anda mengusulkan solusi lain , yang dengan jelas menunjukkan solusi asli tidak akan berfungsi dengan baik dan bahwa ide Anda cacat. Bayangkan Anda tidak tahu yang mana yang merupakan superset dari yang lain. Anda harus membuat baris kode lain untuk memeriksa itu dll. Walaupun saya benci regex secara umum, ini adalah kasus ketika itu adalah solusi terbaik dalam hal kemudahan pemeliharaan dan kesederhanaan.

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

Sumber: php @ metehanarslan di php.net


14

Bagaimana kalau menggunakan strtr()untuk mengganti semua pembatas Anda yang lain dengan yang pertama?

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

Agak tidak terbaca, saya kira, tetapi saya mengujinya sebagai berfungsi di sini.

One-liners ftw!


11

Tidak akan strtok()bekerja untukmu


1
melihat pembatasnya adalah 'vs', ini mungkin tidak berfungsi seperti kata php docu: strtok () membagi string (str) menjadi string yang lebih kecil (token), dengan setiap token dibatasi oleh karakter apa pun dari token. dan 'vs' berisi dua karakter
mikewasmike

1
ini akan menjadi jawaban yang lebih baik jika Anda memasukkan penjelasan atau contoh. sebagaimana adanya, itu lebih dari komentar ...
billynoah

8

Cukup Anda dapat menggunakan kode berikut:

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


2

Saya melakukannya dengan cara ini ...

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

inilah yang saya cari
Manojkiran.A

2

Bagaimana dengan ini?

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

Dalam kasus Anda, Anda harus menggunakan Array untuk param $ delimiters. Maka dimungkinkan untuk menggunakan beberapa karakter sebagai satu pembatas.

Jika Anda tidak peduli tentang membuntuti spasi di hasil Anda, Anda dapat menghapus array_map('trim', [...] )bagian di baris kembali. (Tapi jangan menjadi quibbler dalam kasus ini. Tetap preg_splitdi dalamnya.)

Diperlukan Versi PHP: 5.3.0 atau lebih tinggi.

Anda bisa mengujinya di sini


1

Anda akan memiliki beberapa masalah (bagaimana jika Anda memiliki string ini: "vs @ apel" misalnya) menggunakan metode sepparating ini, tetapi jika kita mulai dengan menyatakan bahwa Anda telah memikirkan hal itu dan telah memperbaiki semua tabrakan yang mungkin, Anda hanya bisa mengganti semua kejadian dari $delimiter[1]untuk $delimiter[n]dengan $delimiter[0], dan kemudian dibagi pada yang pertama?


1

Jika pembatas Anda hanya karakter, Anda dapat menggunakan strtok, yang tampaknya lebih pas di sini. Perhatikan bahwa Anda harus menggunakannya dengan whileloop untuk mencapai efek.


0

Ini akan berhasil:

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

Seperti yang Anda lihat, itu pertama-tama menempelkan bagian yang meledak bersama dengan ruang, untuk kemudian memotongnya lagi, kali ini mengambil ruang bersamanya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.