Php nhiều dấu phân cách trong phát nổ


146

Tôi có một vấn đề, tôi có một chuỗi chuỗi và tôi muốn bùng nổ trong các dấu phân cách khác nhau. Ví dụ

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

và tôi cần một mảng phát nổ trong @ hoặc vs.

Tôi đã viết một giải pháp, nhưng nếu mọi người có giải pháp tốt hơn xin vui lòng gửi ở đây.

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

Tôi chưa bao giờ thấy một câu hỏi với những người đưa ra câu trả lời như "Thế này thì sao", "Thế thì sao"
HosseyNJF

Câu trả lời:


290

những gì về việc sử dụng

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

Kinh ngạc. tôi tự hỏi làm thế nào điều này phấn đấu chống lại các explode()cuộc tranh cãi duy nhất
Ascherer

6
Không thành vấn đề, nếu bạn muốn tạo một hệ thống lớn với phân tích cú pháp chuỗi cứng, cách hiệu quả nhất là trình phân tích cú pháp riêng. Ngoài ra, nó không ảnh hưởng nhiều đến tốc độ hệ thống, nhưng bạn nên sử dụng cách dễ nhất cho mình (Để có tiền hiệu quả)
SergeS

9
Lưu ý rằng một số ký tự cần phải được thoát ra để làm việc (chẳng hạn như /, ?). Ví dụ : preg_split("/(\/|\?|=)/", $foo);.
kenorb

preg_split trả về mảng được lập chỉ mục. Có thể trả lại kết hợp? Ví dụ $str='/x/1/2/3/4/5/y/100/200/z/777'; preg_split("/(x|y|z|)/", $str); và để xemarray('x'=>'1/2/3/4/5', 'y'=>'100/200', 'z'=>'777')
LINKeRxUA

2
Tôi thấy có khoảng trống ở giữa / () /ngăn preg_split hoạt động. Tôi đã phải xóa các khoảng trắng và sau đó nó hoạt động như mong đợi (sử dụng PHP 7)
Boardy

69

Bạn có thể lấy chuỗi đầu tiên, thay thế tất cả @bằng vscách sử dụng str_replace, sau đó phát nổ vshoặc ngược lại.


1
Giải pháp dễ dàng, cuối cùng đã sử dụng nó cho mã Json để thay thế "}}" bằng "|". Dơ bẩn nhưng hiệu quả :)!
Baldráni

5
thật là một thiên tài: D
Deadpool

điều này sẽ không hoạt động đúng khi một dấu phân cách là siêu ký tự khác (ví dụ: (@|@!)trường hợp)

2
@vaxquis Có rồi. str numplace ('@!', '@', $ str); Hãy chắc chắn rằng bạn bắt đầu với dấu phân cách độc đáo nhất.
John Ballinger

@JohnBallinger Không, nó sẽ không - bạn đã đề xuất một giải pháp khác , trong đó cho thấy rõ giải pháp ban đầu sẽ không hoạt động đúng và ý tưởng của bạn là thiếu sót. Hãy tưởng tượng bạn không biết cái nào là superset của cái khác. Bạn sẽ phải tạo một dòng mã khác để kiểm tra điều đó, v.v. Mặc dù tôi ghét regexes nói chung, đây là trường hợp khi đó là giải pháp tốt nhất về khả năng duy trì và đơn giản.

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

Nguồn: php @ metehanarslan tại php.net


14

Làm thế nào về việc sử dụng strtr()để thay thế tất cả các dấu phân cách khác của bạn với cái đầu tiên?

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

Nó không thể đọc được, tôi đoán vậy, nhưng tôi đã thử nó khi làm việc ở đây.

Một lớp lót ftw!


11

Sẽ không strtok()làm việc cho bạn?


1
thấy dấu phân cách của anh ta là 'vs', điều này có thể không hoạt động như php docu nói: strtok () chia một chuỗi (str) thành các chuỗi nhỏ hơn (mã thông báo), với mỗi mã thông báo được phân định bởi bất kỳ ký tự nào từ mã thông báo. và 'vs' chứa hai ký tự
mikewasmike

1
đây sẽ là một câu trả lời tốt hơn nếu bạn bao gồm một lời giải thích hoặc ví dụ. vì nó là như vậy, đó là một nhận xét nhiều hơn ...
billynoah

8

Đơn giản là bạn có thể sử dụng mã sau đây:

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

4

Bạn có thể thử giải pháp này .... Nó hoạt động rất tốt

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

Nguồn: http://www.phpdevtips.com/2011/07/exploding-a-opes-USE-multipl-d006rit-USE-php/


đơn giản và gọn gàng
Manojkiran.

2

Tôi làm theo cách này ...

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

đây là những gì tôi đang tìm kiếm
Manojkiran.

2

Còn cái này thì sao?

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

Trong trường hợp của bạn, bạn nên sử dụng một Mảng cho tham số $ delimiter. Sau đó, có thể sử dụng nhiều ký tự như một dấu phân cách.

Nếu bạn không quan tâm đến dấu cách trong kết quả của mình, bạn có thể xóa array_map('trim', [...] )phần trong hàng trả về. (Nhưng đừng là người ngụy biện trong trường hợp này. Hãy giữ preg_splitnó trong đó.)

Phiên bản PHP bắt buộc: 5.3.0 trở lên.

Bạn có thể kiểm tra nó ở đây


1

Bạn sẽ gặp một số vấn đề (ví dụ nếu bạn có chuỗi này: "vs @ apples") bằng cách sử dụng phương pháp tách biệt này, nhưng nếu chúng tôi bắt đầu bằng cách nói rằng bạn đã nghĩ về điều đó và đã khắc phục tất cả những va chạm có thể xảy ra, bạn chỉ có thể thay thế tất cả lần xuất hiện của $delimiter[1]để $delimiter[n]với $delimiter[0], và sau đó chia trên rằng người đầu tiên?


1

Nếu dấu phân cách của bạn chỉ là ký tự, bạn có thể sử dụng strtok, có vẻ phù hợp hơn ở đây. Lưu ý rằng bạn phải sử dụng nó với một whilevòng lặp để đạt được các hiệu ứng.


0

Điều này sẽ làm việc:

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

Như bạn có thể thấy, đầu tiên nó sẽ dán các bộ phận đã phát nổ cùng với một khoảng trắng, sau đó cắt nó ra một lần nữa, lần này sẽ lấy khoảng trống với anh ta.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.