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;
}
OHLÁLÁ
sumber
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);
Sersan
sumber
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.

John Ballinger
sumber
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

bizauto
sumber
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!

Aubry
sumber
11

Tidak akan strtok()bekerja untukmu

Mchl
sumber
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));
Samer Ata
sumber
4

Anda dapat mencoba solusi ini .... Ini berfungsi dengan baik

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

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

Mayur Chauhan
sumber
sederhana dan rapi
Manojkiran.
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);
}
Vaksin
sumber
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

AF
sumber
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?

Nanne
sumber
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.

Hoàng Long
sumber
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.

Xesau
sumber