বিস্ফোরণে পিএইচপি একাধিক ডিলিমিটার


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

লোকেরা "এটি সম্পর্কে কীভাবে", "সে সম্পর্কে কী"
Hos হোসাইএনজেএফ

উত্তর:


290

ব্যবহার সম্পর্কে কি

$ আউটপুট = প্রেগ_স্প্লিট ("/ (@ | বনাম) /", $ ইনপুট);

অ্যামেজিং। আমি আশ্চর্য explode()
হই

6
এটি গুরুত্বপূর্ণ নয়, আপনি যদি হার্ড স্ট্রিং পার্সিং দিয়ে বড় সিস্টেম তৈরি করতে চান তবে সর্বাধিক কার্যকর উপায়টি নিজের পার্সার is সামগ্রিকভাবে এটি সিস্টেমের গতিতে খুব বেশি প্রভাব ফেলে না, তবে আপনি আপনার জন্য সবচেয়ে সহজ
উপায়টি

9
নোট করুন যে কিছু অক্ষরকে কাজ করতে এড়াতে হবে (যেমন /, ?)। উদাহরণস্বরূপ: preg_split("/(\/|\?|=)/", $foo);
কেনারব

প্রিগ_স্প্লিট ইনডেক্সড অ্যারে দেয়। সাহচর্য ফিরিয়ে দেওয়া কি সম্ভব? উদাহরণস্বরূপ $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
আমি খুঁজে পেয়েছি / (এবং ) /প্রেগ_স্প্লিটকে কাজ করা বন্ধ করে দিয়েছে between আমাকে স্পেসগুলি সরিয়ে ফেলতে হয়েছিল এবং তারপরে এটি প্রত্যাশা অনুযায়ী কাজ করেছিল (পিএইচপি 7 ব্যবহার করে)
বোর্ডি

69

আপনিই প্রথম স্ট্রিং নিতে পারে, সমস্ত প্রতিস্থাপন @সঙ্গে vsব্যবহার str_replace, তারপর বিস্ফোরিত করা vsবা তদ্বিপরীত।


1
সহজ সমাধান, এটি ""} "দ্বারা" J} "প্রতিস্থাপনের জন্য জসন কোড ব্যবহার করে শেষ হয়েছে। নোংরা কিন্তু দক্ষ :)!
বালদরনি

5
কি প্রতিভা: ডি
ডেডপুল

এটি সঠিকভাবে কাজ করবে না যখন একটি ডিলিমিটার অন্যের সুপারসেট (উদাহরণস্বরূপ (@|@!))

2
@ ভ্যাক্সকুইস হ্যাঁ এটি করবে। str_replace ('@!', '@', $ str); আপনি সর্বাধিক অনন্য ডিলিমিটার দিয়ে শুরু করেছেন তা নিশ্চিত করুন।
জন বলিঞ্জার

@ জনবালিংগার না, এটি হবেনা - আপনি অন্য একটি সমাধান প্রস্তাব করেছিলেন , যা পরিষ্কারভাবে দেখায় যে মূল সমাধানটি সঠিকভাবে কাজ করবে না এবং আপনার ধারণাটি ত্রুটিযুক্ত। কল্পনা করুন আপনি জানেন না কোনটি একজনের অপর সুপারস্টেট। এগুলি পরীক্ষা করার জন্য আপনাকে কোডের আরেকটি লাইন তৈরি করতে হবে যদিও আমি সাধারণভাবে রেজেক্সেসকে ঘৃণা করি না কেন, এটি রক্ষণাবেক্ষণযোগ্যতা এবং সরলতার দিক থেকে সবচেয়ে ভাল সমাধান হওয়ার ক্ষেত্রে এটি একটি ক্ষেত্রে।

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

সূত্র: পিএইচপি @ মেথেনারস্লান পিএইচপি.এন.


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

এটি এক প্রকারের অপঠনযোগ্য, আমার ধারণা, তবে আমি এটি এখানে কাজ করে দেখলাম।

ওয়ান-লাইনার!


11

আপনার strtok()জন্য কাজ করবে না ?


1
তার ডিলিমিটারটি 'বনাম' দেখে এটি পিএইচপি ডকুমেন্টের মতো কাজ করতে পারে না: স্ট্রোকক () একটি স্ট্রিং (স্ট্র) ছোট ছোট স্ট্রিংগুলিতে (টোকেন) বিভক্ত করে, প্রতিটি টোকেন টোকন থেকে যে কোনও অক্ষর দ্বারা সীমিত করা হয়। এবং 'বনাম' এ দুটি অক্ষর রয়েছে
মাইকওয়াস্মিকে

1
আপনি যদি কোনও ব্যাখ্যা বা উদাহরণ অন্তর্ভুক্ত করেন তবে এটি আরও ভাল উত্তর হবে। যেমনটি, এটি আরও একটি মন্তব্য ...
বিলিএনও

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- m Multipleple- delimiters- using- 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;
}

আপনার ক্ষেত্রে আপনার $ বিসর্জনকারীদের পরমের জন্য একটি অ্যারে ব্যবহার করা উচিত। তারপরে একাধিক অক্ষর একটি ডিলিমিটার হিসাবে ব্যবহার করা সম্ভব।

যদি আপনি আপনার ফলাফলগুলিতে স্থান ফাঁকা করার বিষয়ে চিন্তা না করেন তবে আপনি array_map('trim', [...] )ফিরে সারিটির অংশটি সরাতে পারেন। (তবে এক্ষেত্রে গোলমাল করবেন না preg_splitit এটিকে রাখুন ))

প্রয়োজনীয় পিএইচপি সংস্করণ: 5.3.0 বা উচ্চতর।

আপনি এটি এখানে পরীক্ষা করতে পারেন


1

সেপারাটিংয়ের এই পদ্ধতিটি ব্যবহার করে আপনার কিছু সমস্যা (যেমন আপনার কাছে এই স্ট্রিংটি রয়েছে: "বনাম @ আপেল" কী আছে), তবে আমরা যদি এই কথাটি বলে শুরু করি যে আপনি এটি সম্পর্কে চিন্তাভাবনা করেছেন এবং এই সমস্ত সম্ভাব্য সংঘর্ষগুলি সংশোধন করেছেন, আপনি শুধু সব occurences প্রতিস্থাপন করতে পারে $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
    )
  )
);

আপনি দেখতে পাচ্ছেন, এটি প্রথমে space n \ r দ্বারা বিস্ফোরিত অংশগুলিকে একটি স্পেসের সাথে একত্র করে, তারপরে আবার আলাদা করে ফেলতে, এবার স্পেসগুলি নিজের সাথে নিয়ে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.