পিএইচপি সাবস্ট্রিং নিষ্কাশন। প্রথম '/' বা পুরো স্ট্রিংয়ের আগে স্ট্রিংটি পান


170

আমি একটি সাবস্ট্রিং নিষ্কাশন করার চেষ্টা করছি। পিএইচপি-তে এটি করার জন্য আমার কিছু সহায়তা দরকার।

এখানে আমি কাজ করছি এমন কয়েকটি নমুনা স্ট্রিং এবং ফলাফলগুলি আমার প্রয়োজন:

home/cat1/subcat2 => home

test/cat2 => test

startpage => startpage

আমি প্রথম অবধি স্ট্রিংটি পেতে চাই /, তবে যদি /উপস্থিত না থাকে তবে পুরো স্ট্রিংটি পান।

আমি চেষ্টা করেছিলাম,

substr($mystring, 0, strpos($mystring, '/'))

আমার মনে হয় এটা বলছেন - অবস্থান পেতে /এবং তারপর অবস্থান 0 থেকে সাবস্ট্রিং পেতে যে অবস্থান।

/বিবৃতিটি খুব বড় না করেই যেখানে নেই সেখানে মামলা কীভাবে পরিচালনা করতে হয় তা আমি জানি না ।

পিএইচপি বিবৃতিটিকে খুব জটিল না করেও কী মামলা পরিচালনা করার কোনও উপায় আছে?


1
এই স্ট্যান্ডলোন লাইব্রেরিতেs($str)->beforeFirst('/') যেমন পাওয়া যায় আপনি তেমন সহায়ক হতে পারেন ।
কাওয়

উত্তর:


261

ব্যবহার explode()

$arr = explode("/", $string, 2);
$first = $arr[0];

এই ক্ষেত্রে, আমি limitপ্যারামিটারটি ব্যবহার করছি explodeযাতে পিএইচপি প্রয়োজনের তুলনায় আর স্ট্রিংটি স্ক্যান না করে।


2
+1 উত্তরের জন্য ধন্যবাদ। এটি কাজ করেছে :) তবে একটি প্রশ্ন। আমি কেবল এটি করতে সক্ষম -> $arr = explode('/',$mystring,2); echo $arr[0];। আমি নিজেই একটি বিবৃতিতে প্রথম স্ট্রিং পেতে অক্ষম - echo explode('/',$mystring,2)[0];। যেহেতু বিস্ফোরণটি একটি অ্যারের ফিরিয়ে দেয়, তাই আমার এটি সঠিকভাবে করা উচিত? তবে আমি একটি ত্রুটি পেয়েছি। কোনও পরামর্শ?

1
পিএইচপি আপনাকে ফাংশন থেকে রিটার্ন মানগুলিতে সূচীকরণ পছন্দ করে না।
gnud

3
উহু. ঠিক আছে. এটা সম্ভব হলে ভাল হত।

36
explode() + [0]লেখার জন্য একটি দীর্ঘ-বায়ুযুক্ত উপায়strtok($string, "/")
মারিও


293

সবচেয়ে বেশি কার্যকরী সমাধান strtokফাংশন:

strtok($mystring, '/')

উদাহরণ স্বরূপ:

$mystring = 'home/cat1/subcat2/';
$first = strtok($mystring, '/');
echo $first; // home

এবং

$mystring = 'home';
$first = strtok($mystring, '/');
echo $first; // home

25
এটি current-explodeসমাধানের চেয়ে প্রায় 40% দ্রুত । (এমন নয় যে আমি এটা তাই প্রায়ই যে এটা গুরুত্বপূর্ণ ব্যবহার করুন।)
towr

5
এটি মার্জিত এবং দ্রুত - এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
Kosta Kontos

5
এটি ব্যতীত উত্তর হওয়া উচিত। অবশ্যই দ্রুত এবং আরও মেমরি এবং সিপিইউ চক্রগুলি কার্যকর তারপরে explodeপ্রদত্ত যে কোনও সমাধান।
শিবম মহেশ্বরী

সঙ্গে সমস্যা strtokহল first/secondফিরে আসবে firstকিন্তু /secondফিরে আসবে secondএকটি খালি স্ট্রিং বদলে।
rybo111

আমার উপরোক্ত মন্তব্যে আরও: খালি অংশটি যখন খুঁজে পেয়েছিল তখন আচরণটি পিএইচপি ৪.১.০ এর সাহায্যে পরিবর্তিত হয়েছে। পুরানো আচরণটি একটি খালি স্ট্রিং ফিরিয়েছিল, যখন নতুন, সঠিক, আচরণটি কেবল স্ট্রিংয়ের অংশটি এড়িয়ে যায়
rybo111

95
$first = explode("/", $string)[0];

2
মার্জিত, কিন্তু কম্পিউটার সময় খুব দক্ষ নয়। তবে আজকাল লোকেরা
ডেনিস

13

এই সম্পর্কে কি :

substr($mystring.'/', 0, strpos($mystring, '/'))

মাইস্ট্রিংয়ের শেষে কেবল একটি '/' যুক্ত করুন যাতে আপনি নিশ্চিত হন যে কমপক্ষে একটি রয়েছে;)


এটি করার আগে স্ট্রিংয়ে একটি স্ল্যাশ রয়েছে কিনা তা আপনি কেবল পরীক্ষা করতে পারেন। যাইহোক, এটি সহজ সমাধান।
গিলহের্মে সাম্পাও ২৯:২০

12

গৃহীত উত্তরের এক-লাইন সংস্করণ:

$out=explode("/", $mystring, 2)[0];

পিএইচপি 5.4+ এ কাজ করা উচিত


1
নীচের একটির মতো নয়, "2" এটি তৈরি করা অ্যারে আইটেমের সংখ্যা সীমাবদ্ধ করে। ভাল চিন্তা.
বেন সিএ-

9

এটি সম্ভবত আমার সবচেয়ে সংক্ষিপ্ততম উদাহরণ:

list($first) = explode("/", $mystring);

1) list()হবে স্বয়ংক্রিয়ভাবে বরাদ্দ স্ট্রিং পর্যন্ত "/"যদি বিভেদক পাওয়া যায়
2) যদি বিভেদক "/"তারপর পুরো স্ট্রিং নিয়োগ করা যাবে পাওয়া যায় নি

... এবং আপনি যদি সত্যই পারফরম্যান্সে আবেশ পান, আপনি বিস্ফোরণে অতিরিক্ত পরামিতি যুক্ত করতে পারেন explode("/", $mystring, 2)যা প্রত্যাবর্তিত উপাদানগুলির সর্বাধিক সীমাবদ্ধ করে।


2
আমি এই পদ্ধতির পছন্দ। একটি অপ্রয়োজনীয় অ্যারে তৈরি করে সংরক্ষণ করে। এবং strtok()অনিরাপদ।
rybo111

1
@ রাইবো ১১১১: কী অনিরাপদ strtok()?
হ্যাক্রে

@ rybo111 আমি হ্যাকারের অনুভূতি প্রতিধ্বনিত করি; strtok()অনিরাপদ কি করে তোলে ?
ডক্টর জে

@hakre আমার উত্তর jmarceli এর উত্তর দেখুন। এটি পিএইচপি সংস্করণের উপর নির্ভর করে অপ্রত্যাশিত আচরণের কারণ হতে পারে।
rybo111

পিএইচপি 4.1.0 - rly?
hakre

8

দেরী আগের চেয়ে ভাল। পিএইচপি এর জন্য একটি পূর্বনির্ধারিত ফাংশন রয়েছে। এখানে যে ভাল উপায়।

strstr

আপনি যদি ম্যাচের আগে অংশটি পেতে চান তবে ঠিক আগে_নয়েডল (তৃতীয় প্যারামিটার) সেট করুন true http://php.net/manual/en/function.strstr.php

function not_strtok($string, $delimiter)
{    
    $buffer = strstr($string, $delimiter, true);

    if (false === $buffer) {
        return $string;
    }

    return $buffer;
}

var_dump(
    not_strtok('st/art/page', '/')
);

এটি ব্যবহার করা নিরাপদ নয় যদি আপনি নিশ্চিত হন না যে স্ট্রিতে সূঁচ রয়েছে।
foo આવૃત્તિ

@ ফ্রিকোয়েন্সি - সত্য, তবে আপনি নিশ্চিত যে স্ট্রিংটি যাচাই করছেন তার শেষে আপনি সর্বদা অক্ষরটি যুক্ত করতে পারেন।
মাইকচিনকেলে

ধন্যবাদ। আমার পরীক্ষাগুলি দেখায় যে strstrএটির চেয়ে কিছুটা দ্রুত strtok। প্রাক্তনের সাথে যাব।
ইয়ান ওয়াই

5

পিএইচপি 5.3-তে ফাংশন স্ট্রাস্টার () এই কাজটি করা উচিত .. তৃতীয় প্যারামিটারটি সত্য হিসাবে সেট করা উচিত ..

তবে আপনি যদি 5.3 ব্যবহার করছেন না, তবে নীচের ফাংশনটি সঠিকভাবে কাজ করা উচিত:

function strbstr( $str, $char, $start=0 ){
    if ( isset($str[ $start ]) && $str[$start]!=$char ){
        return $str[$start].strbstr( $str, $char, $start+1 );
    }
}

যদিও আমি এটি পরীক্ষা করে দেখিনি, তবে এটি ঠিক কাজ করা উচিত .. এবং এটিও বেশ দ্রুত


3
+1 এর জন্য strstr(), তবে সচেতন হন যে falseস্ট্রিংটি না থাকলে এটি ফিরে আসে $needle, সুতরাং explode()উপরের সমাধানগুলি এই ক্ষেত্রে আরও ভাল ফিট।
বেনিয়ামিন

3

আপনি এটি যত্ন নিতে একটি সহায়ক ফাংশন তৈরি করতে পারেন:

/**
 * Return string before needle if it exists.
 *
 * @param string $str
 * @param mixed $needle
 * @return string
 */
function str_before($str, $needle)
{
    $pos = strpos($str, $needle);

    return ($pos !== false) ? substr($str, 0, $pos) : $str;
}

এখানে একটি ব্যবহারের কেস:

$sing = 'My name is Luka. I live on the second floor.';

echo str_before($sing, '.'); // My name is Luka

3

আপনি এটির মতো একটি রেজেক্স ব্যবহার করার চেষ্টা করতে পারেন:

$s = preg_replace('|/.*$|', '', $s);

কখনও কখনও, রেজেক্স যদিও ধীর হয়, সুতরাং যদি পারফরম্যান্স কোনও সমস্যা হয় তবে এটি সঠিকভাবে বেঞ্চমার্ক করে নিশ্চিত করুন এবং সাবস্ট্রিংগুলির সাথে অন্য কোনও বিকল্প ব্যবহার করুন যদি এটি আপনার পক্ষে আরও উপযুক্ত হয়।


2
রিজেক্স সম্ভবত খুব বেশি দক্ষ হয়ে উঠেছে, তবে যেহেতু আমি explodeএটির বিষয়ে একই কথা বলি তা কোনটি দ্রুত তা দেখতে আকর্ষণীয় হবে।
rvighne

1
এটির সাথে একেবারেই কোনও ভুল নেই এবং আমি এটি 2 ডাউনভোটের কেন যোগ্য হবে তা ভাবতে পারি না। আমি ব্যক্তিগতভাবে রেজেক্স ব্যবহার করতাম না তবে এটি অবশ্যই ভুল নয়।
বিলেণোহ

2

ব্যবহার currentকরা explodeপ্রক্রিয়াটি সহজ করবে।

 $str = current(explode("/", $str, 2));

0
$string="kalion/home/public_html";

$newstring=( stristr($string,"/")==FALSE ) ? $string : substr($string,0,stripos($string,"/"));

0

আপনি এই ওয়ান লাইন সমাধানটিও ব্যবহার করতে পারেন

list($substring) = explode("/", $string);

-1

আমি এই কাজ করা উচিত?

substr($mystring, 0, (($pos = (strpos($mystring, '/') !== false)) ? $pos : strlen($mystring)));

আপনার ফাংশনটি সর্বদা প্রথম চরটি ফিরিয়ে দেবে কারণ আপনি str পজিতে এটি নির্ধারণের আগে আপনি (স্ট্রপোস ($ মাইস্ট্রিং, '/')! == মিথ্যা) করছেন, আপনাকে একটি (($ pos = strpos ($ ফার্স্ট কলামনাম, '_'))! == মিথ্যা)। এই 1 জন লাইনার লোকটি পোস্ট করবে যে প্রশ্নটি খুঁজছে।
মিহাই পি।

-1

কেন ব্যবহার করবেন না:

function getwhatiwant($s)
{
    $delimiter='/';
    $x=strstr($s,$delimiter,true);
    return ($x?$x:$s);
}

বা:

   function getwhatiwant($s)
   {
       $delimiter='/';
       $t=explode($delimiter, $s);
       return ($t[1]?$t[0]:$s);
   }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.