PHP ตัวคั่นหลายตัวในการระเบิด


146

ฉันมีปัญหาฉันมีอาร์เรย์สตริงและฉันต้องการระเบิดในตัวคั่นที่แตกต่างกัน ตัวอย่างเช่น

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

และฉันต้องการอาร์เรย์ที่ระเบิดใน @ หรือเทียบกับ

ฉันได้เขียนวิธีการแก้ปัญหาแล้ว แต่ถ้าทุกคนมีทางออกที่ดีกว่าโปรดโพสต์ที่นี่

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

ฉันไม่เคยเห็นคำถามกับคนที่ให้คำตอบเช่น "แล้วนี่", "แล้ว
ล่ะ

คำตอบ:


290

สิ่งที่เกี่ยวกับการใช้

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

น่าอัศจรรย์ ฉันสงสัยว่าสิ่งนี้ชอล์กขึ้นกับexplode()ข้อโต้แย้งเดียว
Ascherer

6
ไม่เป็นไรถ้าคุณต้องการสร้างระบบขนาดใหญ่ด้วยการแยกสตริงแบบยากวิธีที่มีประสิทธิภาพมากที่สุดคือตัวแยกวิเคราะห์เอง Oterwise มันไม่ได้มีผลกระทบมากในความเร็วของระบบ แต่คุณ preffer จะใช้วิธีที่ง่ายที่สุดสำหรับคุณ (เพื่อให้เงินที่มีประสิทธิภาพ)
SergeS

9
โปรดทราบว่าอักขระบางตัวจำเป็นต้องได้รับการยกเว้นให้ทำงาน (เช่น/, ?) ตัวอย่างเช่นpreg_split("/(\/|\?|=)/", $foo);.
kenorb

preg_split ส่งคืนอาร์เรย์ที่จัดทำดัชนี เป็นไปได้ไหมที่จะคืนความสัมพันธ์? ตัวอย่างเช่น$str='/x/1/2/3/4/5/y/100/200/z/777'; preg_split("/(x|y|z|)/", $str); และเพื่อดูarray('x'=>'1/2/3/4/5', 'y'=>'100/200', 'z'=>'777')
LINKeRxUA

2
ฉันพบว่ามีช่องว่างระหว่าง/ (และ) /หยุด preg_split ไม่ให้ทำงาน ฉันต้องลบช่องว่างออกจากนั้นก็ทำงานได้ตามที่คาดหวัง (ใช้ PHP 7)
Boardy

69

คุณสามารถใช้สายแรกแทนที่ทั้งหมด@ด้วยการvsใช้str_replaceแล้วระเบิดvsหรือในทางกลับกัน


1
วิธีแก้ปัญหาที่ง่ายและใช้รหัส Json เพื่อแทนที่ "}}" โดย "|" สกปรก แต่มีประสิทธิภาพ :)!
Baldráni

5
อัจฉริยะ: D
Deadpool

นี้จะไม่ทำงานอย่างถูกต้องเมื่อตัวคั่นหนึ่งเป็น superset ของอื่น ๆ (เช่น(@|@!)กรณี)

2
@vaxquis ใช่มันจะ str_replace ('@!', '@', $ str); ตรวจสอบให้แน่ใจว่าคุณเริ่มต้นด้วยตัวคั่นที่เป็นเอกลักษณ์ที่สุด
John Ballinger

@JohnBallinger ไม่ไม่ - คุณได้เสนอวิธีแก้ไขปัญหาอื่นซึ่งแสดงให้เห็นอย่างชัดเจนว่าโซลูชันดั้งเดิมทำงานไม่ถูกต้องและความคิดของคุณมีข้อบกพร่อง ลองนึกภาพคุณไม่รู้ว่าอันไหนเป็นซุปเปอร์เซ็ตของอีกอัน คุณต้องสร้างโค้ดอีกหนึ่งบรรทัดเพื่อตรวจสอบในขณะที่ฉันเกลียด regexes โดยทั่วไปนี่เป็นกรณีที่มันเป็นทางออกที่ดีที่สุดในแง่ของการบำรุงรักษาและความเรียบง่าย

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

ที่มา: php @ metehanarslan ที่ php.net


14

วิธีใช้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)
                )
            )
        )
    );
}

ฉันเดาไม่ได้ แต่ฉันทดสอบว่ามันทำงานได้ที่นี่

One-liners ftw!


11

จะไม่strtok()ทำงานให้คุณ?


1
การเห็นตัวคั่นของเขาคือ 'vs' สิ่งนี้อาจใช้งานไม่ได้เมื่อ php docu พูดว่า: strtok () แยกสตริง (str) เป็นสตริงขนาดเล็ก (โทเค็น) โดยแต่ละโทเค็นจะถูกคั่นด้วยอักขระใด ๆ จากโทเค็น และ 'vs' มีอักขระสองตัว
mikewasmike

1
นี่จะเป็นคำตอบที่ดีกว่าถ้าคุณรวมคำอธิบายหรือตัวอย่าง มันเป็นก็มากขึ้นของความคิดเห็น ...
billynoah

8

เพียงคุณสามารถใช้รหัสต่อไปนี้:

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

4

คุณสามารถลองใช้วิธีนี้ .... มันใช้งานได้ดี

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/


เรียบง่ายและเรียบร้อย
Manojkiran.A

2

ฉันทำแบบนี้ ...

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

นี่คือสิ่งที่ฉันกำลังมองหา
Manojkiran.A

2

แล้วเรื่องนี้ล่ะ

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

ในกรณีของคุณคุณควรใช้ Array สำหรับพารามิเตอร์ $ delimiters จากนั้นก็เป็นไปได้ที่จะใช้ตัวอักษรหลายตัวเป็นตัวคั่นเดียว

หากคุณไม่สนใจช่องว่างต่อท้ายในผลลัพธ์ของคุณคุณสามารถลบarray_map('trim', [...] )ส่วนในแถวย้อนกลับได้ (แต่อย่าเป็นคนที่เล่นโวหารในกรณีนี้เก็บไว้preg_splitในนั้น)

เวอร์ชั่น PHP ที่ต้องการ: 5.3.0 หรือสูงกว่า

คุณสามารถทดสอบได้ที่นี่


1

คุณกำลังจะมีปัญหา (เช่นถ้าคุณมีสตริงนี้: "vs @ แอปเปิ้ล" เป็นต้น) โดยใช้วิธีการ sepparating นี้ แต่ถ้าเราเริ่มต้นด้วยการระบุว่าคุณคิดถึงเรื่องนั้นและแก้ไขการชนที่เป็นไปได้ทั้งหมด คุณก็สามารถแทนที่ปรากฏทั้งหมด$delimiter[1]ไป$delimiter[n]ด้วย$delimiter[0]และจากนั้นก็แยกในที่หนึ่งครั้งแรก?


1

หากตัวคั่นของคุณเป็นอักขระเท่านั้นคุณสามารถใช้strtokซึ่งน่าจะเหมาะกว่าที่นี่ โปรดทราบว่าคุณต้องใช้กับwhileลูปเพื่อให้ได้เอฟเฟกต์


0

สิ่งนี้จะได้ผล:

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

อย่างที่คุณเห็นมันเป็นครั้งแรกที่จ้องมอง \ n \ r ชิ้นส่วนที่ระเบิดได้พร้อมกับช่องว่างเพื่อตัดมันออกจากกันอีกครั้งคราวนี้พาช่องว่างกับเขา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.