विस्फोट में कई सीमांकक 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

का उपयोग करने के बारे में क्या

$ आउटपुट = preg_split ("/ (@ | vs) /", $ इनपुट);

गजब का। मुझे आश्चर्य है कि यह explode()एकल तर्कों के खिलाफ कैसे चलता है
Ascherer

6
इससे कोई फर्क नहीं पड़ता, अगर आप हार्ड स्ट्रिंग पार्सिंग के साथ बड़ी प्रणाली बनाना चाहते हैं, तो सबसे प्रभावी तरीका खुद का पार्सर है। सिस्टम की गति पर इसका अधिक प्रभाव नहीं होता है, लेकिन आप के लिए सबसे आसान तरीका इस्तेमाल करना बेहतर होता है (धन प्रभावी होना)
सर्जस

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 को रोक दिया। मुझे रिक्त स्थान हटाना था और फिर यह उम्मीद के
मुताबिक

69

आप पहली स्ट्रिंग ले सकते हैं, उपयोग करने के @साथ सभी को बदल सकते हैं , फिर इसके विपरीत या विस्फोट कर सकते हैं।vsstr_replacevs


1
आसान समाधान, "}} को" "|" गंदा लेकिन कुशल :)!
बाल्द्रनी

5
एक प्रतिभाशाली व्यक्ति: D
डेडपूल

यह ठीक से काम नहीं करेगा जब एक सीमांकक दूसरे का सुपरसेट होता है (उदाहरण के लिए (@|@!)केस)

2
@vaxquis हाँ, यह होगा। str_replace ('@!', '@', $ str); सुनिश्चित करें कि आप सबसे अनूठे सीमांकक के साथ शुरू करते हैं।
जॉन बॉलिंगर

@JohnBallinger नहीं, यह नहीं होगा - आपने एक और समाधान प्रस्तावित किया है , जो स्पष्ट रूप से मूल दिखाता है समाधान ठीक से काम नहीं करेगा और आपका विचार त्रुटिपूर्ण है। कल्पना कीजिए कि आप नहीं जानते कि कौन सा दूसरे का सुपरसेट है। आपको उस आदि की जांच के लिए कोड की एक और लाइन बनानी होगी, जबकि मैं सामान्य तौर पर रेग्जेस से नफरत करता हूं, यह एक ऐसा मामला है जब यह स्थिरता और सादगी के मामले में सबसे अच्छा समाधान है।

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()पहले एक के साथ अपने सभी अन्य delimiters के विकल्प का उपयोग करने के बारे में ?

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

यह अपठनीय की तरह है, मुझे लगता है, लेकिन मैंने इसे यहां काम करने के रूप में परीक्षण किया।

वन-लाइनर्स ftw!


11

strtok()आपके लिए काम नहीं करेगा ?


1
उनका परिसीमन 'बनाम' है, यह काम नहीं कर सकता क्योंकि php फिल्म्स कहता है: strtok () एक स्ट्रिंग (str) को छोटे स्ट्रिंग्स (टोकन) में विभाजित करता है, प्रत्येक टोकन को टोकन से किसी भी वर्ण द्वारा सीमांकित किया जाता है। और 'बनाम' में दो किरदार शामिल हैं
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-use-php/


सरल और साफ
मनोज्ञिरन।

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

यह वही है जो मैं देख रहा था
मनोजकिरण।

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

आपके मामले में आपको $ delimiters के लिए एक ऐरे का उपयोग करना चाहिए। फिर एक सीमांकक के रूप में कई वर्णों का उपयोग करना संभव है।

यदि आपको अपने परिणामों में रिक्त स्थान की परवाह नहीं है, तो आप array_map('trim', [...] )वापसी पंक्ति में भाग को हटा सकते हैं । (लेकिन इस मामले में एक विदूषक मत बनो। इसे रखो preg_split।)

आवश्यक PHP संस्करण: 5.3.0 या उच्चतर।

आप इसे यहाँ परीक्षण कर सकते हैं


1

आप कुछ समस्याओं के लिए जा रहे हैं (अगर आपके पास यह स्ट्रिंग है: उदाहरण के लिए "बनाम @ सेब") छींटे मारने की इस पद्धति का उपयोग करते हुए, लेकिन अगर हम यह बताते हुए शुरू करते हैं कि आपने उस बारे में सोचा है और उन सभी संभावित टकरावों को ठीक कर लिया है, तो तुम सिर्फ के सभी आवृत्तियां बदल सकते $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 विस्फोट वाले हिस्सों को चमकता है, फिर इसे फिर से काटकर अलग कर देता है, इस बार उसके साथ रिक्त स्थान ले रहा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.