একটি নির্দিষ্ট অক্ষরের পরে একটি স্ট্রিংয়ের অংশটি সরান


144

আমি কেবল ভাবছিলাম যে কীভাবে আমি পিএইচপি-র একটি নির্দিষ্ট সাবস্ট্রিংয়ের পরে সমস্ত কিছু সরিয়ে ফেলতে পারি

উদা:

Posted On April 6th By Some Dude

আমি এটি রাখতে চাই যাতে এটি সমস্ত পাঠ্য সরিয়ে দেয় এবং তারপরে সাব বাই স্ট্রিং "দ্বারা"

ধন্যবাদ


1
সাব স্ট্রিংটি দু'বার (বা আরও) ঘটলে কী হবে?
বার্ট কায়ার্স

18
ঠিক যেমন একটি নোট, আপনি যদি এটি করছেন তবে আপনি অন্য কারও বিষয়বস্তু নিতে এবং এটি নিজের সাইটে উপস্থাপন করতে পারেন, না
ceejayoz

আমি সিজেজোজের সাথে একমত এটি আপনার মনে হয় এমন সামগ্রীটি ব্যবহার করার চেষ্টা করছে যা আপনার কাছে অ্যাক্সেস নেই এবং আপনি মূল লেখকের কোনও রেফারেন্স সরিয়ে দেওয়ার চেষ্টা করছেন sounds এটি খুব সুন্দর হবে না ...
স্বাওয়ারেসসপ


1
কোনও সিএমএস দ্বারা উত্পাদিত সামগ্রী নিয়ে কাজ করার সময় বৈধ কারণে এই জাতীয় জিনিসটি করা খুব সাধারণ বিষয়। কারণ আপনি কখনই আসল কোডটি নিয়ে এই জাতীয় স্নিপেট তৈরি করতে চান না কারণ আপনি আপনার আপডেটগুলি ভঙ্গ করবেন; সুতরাং, আপনি এটি এটি করতে দিন, তারপরে আপনি নিজের জিনিসটি করুন।
নোসাজিমিকি

উত্তর:


292
$variable = substr($variable, 0, strpos($variable, "By"));

সরল ইংরাজীতে: স্ট্রিংয়ের অংশটি আমাকে শুরুতে শুরু করুন এবং আপনি যে অবস্থানে প্রথমে ডিলিমিনেটরের মুখোমুখি হোন সে স্থানে শেষ করুন।


11
"বাই" বাই "উপস্থিত থাকলে" কেবল
এটিই করা

3
তুমি ঠিক বলছো. "বাই" না পাওয়া গেলে strpos FALSE ফিরবে। প্রদত্ত দৈর্ঘ্যটি মিথ্যা হলে সাবস্ট্রাস্ট একটি খালি স্ট্রিং ফিরিয়ে দেবে। অনুশীলনে সম্ভবত "বাই" বিদ্যমান আছে কিনা তা যাচাই করা এবং তারপরে এটি কেবল তখনই করা কার্যকর হবে (অন্যথায় কেবল স্ট্রিংটি একা রেখে)।
অস্টিন ফিটজপ্যাট্রিক

13
এটি কাজ করে: স্ট্রপোস ($ ভেরিয়েবল, "বাই")? সাবস্ট্রাস্ট ($ ভেরিয়েবল, 0, স্ট্রপোস ($ ভেরিয়েবল, "বাই")): $ ভেরিয়েবল;
নোহ গ্যারি

আমি একটি উত্তর রেখেছি যা আমি মনে করি নীচে সমস্ত বিষয়কে সম্বোধন করে এবং কেস সংবেদনশীল, একাধিক ঘটনা এবং নিয়মিত প্রকাশের মতো সমস্ত ধরণের জিনিস মোকাবিলার উপায়গুলিও ব্যাখ্যা করি। যদি কেউ আরও নমনীয় কিছু করতে চায় বা ইনপুটটিতে আগত নিয়ন্ত্রণের নিয়ন্ত্রণ না থাকে তবে এটি সম্ভবত পরীক্ষা করে দেখার মতো।
আজউন্ড্রিয়ার

1
আমার পক্ষে @ Goahnary নিখুঁত কাজ করে!
ডেনিস

106

আপনি যদি পিএইচপি 5.3+ ব্যবহার করছেন তবে স্ট্রাস্টারের পতাকা পূর্বে_নিডেল দেখুন ()

$s = 'Posted On April 6th By Some Dude';
echo strstr($s, 'By', true);

4
ধন্যবাদ, আজকাল এটিই আসল সঠিক উত্তর !
ম্যাটমার্বন

59
নোট করুন যে FALSEস্ট্রিংয়ের অংশটি পাওয়া না গেলে এটি ফিরে আসবে । সুতরাং সমাধানটি হতে পারে:echo strstr($s, 'By', true) ?: $s;
কেনারব

6
en কেনরবের উত্তরটি আজ গ্রহণযোগ্য উত্তর হওয়া উচিত। অন্য বিকল্পটি স্কোয়ারক্যান্ডির explode(' By', $s)[0]আইএমএইচও হবে
জ্যাক মরিস

প্রকৃতপক্ষে, কেনারবের অস্তিত্ব পরীক্ষা করা এটি করার উপায়, যদিও স্ট্রিংটি পরীক্ষা করার প্রয়োজন হয় না।
ব্যারিমোড

কেবল এখানে @ কেনারবের পদ্ধতিটি বলতে চাই।
কুইন কমেন্ডেন্ট

32

কীভাবে ব্যবহার করবেন explode:

$input = 'Posted On April 6th By Some Dude';
$result = explode(' By',$input);
return $result[0];

সুবিধাদি:


@ বিকোক - যতক্ষণ না এটি কাজ করে এবং অবজ্ঞাপূর্ণ না হয় ততক্ষণ পুরানো রীতিতে কী ভুল?
স্কয়ারকাণ্ডি

3
এটি স্বীকৃত উত্তরের প্রয়োজনীয় ডিলিমিটার স্ট্রিংয়ের অস্তিত্বের জন্য অতিরিক্ত চেককে সরিয়ে দেয়।
ডেভিড কুলেন

17

আপনি করতে পারেন:

$posted = preg_replace('/ By.*/', '', $posted);
echo $posted;

4
+1 এটিই কেবলমাত্র কাজ করে যদি কন্ট্রোল অক্ষর উপস্থিত না থাকে (অন্যরা যদি কন্ট্রোল অক্ষর উত্সের স্ট্রিংগুলিতে উপস্থিত না হয় তবে খালি স্ট্রিং ফিরিয়ে দেয়)
টম অাগার

9

একটি পদ্ধতি হ'ল:

$str = 'Posted On April 6th By Some Dude';
echo strtok($str, 'By'); // Posted On April 6th

এটি বেস্ট স্ট্রিং না থাকা সত্ত্বেও এটি সর্বোত্তম উত্তরটি কার্যকর করে, সাবস্ট্রাস্টর উত্তরটি ভুল কারণ এটি ডোস্ট অস্তিত্বের সাথে এটি ব্যর্থ হয়।
নিউটেকনিক

এটি ভুল: ফাংশনটি বিভাজিত হবে না By, তবে ২ য় প্যারামিটারের কোনও চর দ্বারা। অর্থ, এটি দ্বারা পারেন বিভক্ত হবে Bবা y। প্রযুক্তিগতভাবে, এটি এ এর ​​আগে সবকিছু পাচ্ছে না By
এমএসবি

সতর্কতা অবলম্বন করুন: স্ট্রিংকের পরে স্ট্রিংয়ের অংশটি ফিরে আসবে যদি এটি স্ট্রিংয়ের প্রথম অক্ষর হয়, যেমন, strtok('a:b', ':')ফিরে আসবে aতবে strtok(':b', ':')ফিরে আসবে b, আপনি যেমন আশা করেছিলেন তেমন খালি স্ট্রিং নয় not
কুইন কমেন্ডেন্ট

6

এটা চেষ্টা কর.

function strip_after_string($str,$char)
    {
        $pos=strpos($str,$char);    
        if ($pos!==false) 
        {
            //$char was found, so return everything up to it.
            return substr($str,0,$pos);
        } 
        else 
        {
            //this will return the original string if $char is not found.  if you wish to return a blank string when not found, just change $str to ''
            return $str; 
        }
    }

ব্যবহার:

<?php
    //returns Apples
    $clean_string= strip_after_string ("Apples, Oranges, Banannas",",");
?>

আপনি সাসের পরিবর্তে ফাংশনটির নামকরণ করা এবং ক্রিপ্টিক প্রাথমিক পদ্ধতিতে পূর্ণ কোড ভিত্তি রাখলে আরও ভাল। যদিও এই প্রশ্নের উত্তর এটি আমার সবচেয়ে প্রিয় পাঠযোগ্য is
আন্থার

5

অস্টিনের উত্তর আপনার উদাহরণের ক্ষেত্রে কাজ করে।

আরও সাধারণভাবে, আপনি যখন বিভাজন করছেন সেই স্ট্রিংগুলি স্ট্রিংয়ের মধ্যে পৃথক হতে পারে তখন আপনি নিয়মিত এক্সপ্রেশন ফাংশনগুলি সন্ধান করতে ভাল করবেন :

$ ভেরিয়েবল = প্রেগ_রেপ্লেস ('/ বাই। * /', '', $ ভেরিয়েবল);

+1, এটা ঠিক। আপনি যদি "লেখক:" বা "লিখিত দ্বারা:" বা "এর সম্মতিতে ব্যবহৃত:" তেও বিভক্ত হতে চান তবে নিয়মিত প্রকাশ করা সম্ভবত সবচেয়ে সহজ হবে। আমি যখন কোনও রেজেক্স যুক্তি না করি, তবুও আমি তাদের এড়ানোর প্রবণতা দেখি কারণ তারা তত্ক্ষণাত কোডে জটিলতার একটি স্তর যুক্ত করেছে বলে মনে হচ্ছে (কমপক্ষে আমার কাছে)
অস্টিন ফিটজপ্যাট্রিক

4

আপনি ব্যবহার listএবং explodeফাংশন করতে পারেন :

list($result) = explode("By", "Posted On April 6th By Some Dude", 2);
// $result is "Posted On April 6th "

এটি সবচেয়ে সঠিক। আমি কীভাবে চাই যে আমি এই জন্য দু'বারের জন্য ভোট দিতে পারি
জন ম্যাক্স



2

নিয়মিত অভিব্যক্তি ব্যবহার করে: $string = preg_replace('/\s+By.*$/', '', $string)


এই কোড-শুধুমাত্র উত্তরের সাথে দয়া করে কিছু ব্যাখ্যা অন্তর্ভুক্ত করুন।
মিকম্যাকুসা

2

প্রথম বাইয়ের পরে স্ট্রিংয়ের মাধ্যমে সমস্ত কিছু কেটে ফেলার জন্য নীচে সবচেয়ে কার্যকর পদ্ধতি (রান-টাইম দ্বারা) is যদি বাই অস্তিত্ব না থাকে তবে সম্পূর্ণ স্ট্রিংটি ফিরে আসে। ফলাফলটি $ এস রেজাল্টে।

$sInputString = "Posted On April 6th By Some Dude";
$sControl = "By";

//Get Position Of 'By'
$iPosition = strpos($sInputString, " ".$sControl);
if ($iPosition !== false)
  //Cut Off If String Exists
  $sResult = substr($sInputString, 0, $iPosition);
else
  //Deal With String Not Found
  $sResult = $sInputString;

//$sResult = "Posted On April 6th"

আপনি যদি কেস সংবেদনশীল হতে না চান তবে স্ট্রপোসের পরিবর্তে স্ট্রিপোস ব্যবহার করুন । আপনি যদি মনে করেন বাই দ্বারা একাধিকবার উপস্থিত থাকতে পারে এবং শেষ ঘটনাটির পরে সমস্ত কিছু কাটাতে চান তবে স্ট্রপপস ব্যবহার করুন

নীচে একটি কম দক্ষ পদ্ধতি রয়েছে তবে এটি কোডের কম স্থান গ্রহণ করে। এই পদ্ধতিটি আরও নমনীয় এবং আপনাকে কোনও নিয়মিত প্রকাশ করতে দেয়।

$sInputString = "Posted On April 6th By Some Dude";
$pControl = "By";

$sResult = preg_replace("' ".$pControl.".*'s", '', $sInputString);

//$sResult = "Posted On April 6th"

উদাহরণস্বরূপ, আপনি যদি দিনের পরে সমস্ত কিছু সরিয়ে নিতে চান:

$sInputString = "Posted On April 6th By Some Dude";
$pControl = "[0-9]{1,2}[a-z]{2}"; //1 or 2 numbers followed by 2 lowercase letters.

$sResult = preg_replace("' ".$pControl.".*'s", '', $sInputString);

//$sResult = "Posted On April"

সংবেদনশীল ক্ষেত্রে, এই জাতীয় আই মডিফায়ার যুক্ত করুন:

$sResult = preg_replace("' ".$pControl.".*'si", '', $sInputString);

গত গত সবকিছু পেতে কসম ভালো শুরুতে যদি আপনি মনে করেন সেখানে একাধিক হতে পারে, একটি অতিরিক্ত যোগ *।:

$sResult = preg_replace("'.* ".$pControl.".*'si", '', $sInputString);

তবে আপনি এখানে যা করার চেষ্টা করছেন তা করতে প্রাক-ম্যাচ ব্যবহার করতে পারেন এমন একটি শক্তিশালী উপায়ও এখানে:

$sInputString = "Posted On April 6th By Some Dude";

$pPattern = "'Posted On (.*?) By (.*?)'s";
if (preg_match($pPattern, $sInputString, $aMatch)) {
  //Deal With Match
  //$aMatch[1] = "April 6th"
  //$aMatch[2] = "Some Dude"
} else {
  //No Match Found
}

নিয়মিত প্রকাশগুলি প্রথমে বিভ্রান্ত বলে মনে হতে পারে তবে আপনি একবারে তাদের আয়ত্ত করার পরে সেগুলি সত্যই শক্তিশালী এবং আপনার সেরা বন্ধু হতে পারে! শুভকামনা!


1

কেন ...

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

এটি নিম্নলিখিতগুলিকে সম্বোধন করে:

  • আরজিইএক্স বনাম স্ট্রিপপস / স্টারস্টার / স্ট্রিপস / স্ট্রিস্টার ব্যবহারের পারফরম্যান্স প্রভাব।
  • অক্ষর / স্ট্রিং স্ট্রিংয়ে পাওয়া না গেলে স্ট্রিপোজ / স্ট্রিপপস ব্যবহার করা।
  • স্ট্রিংয়ের বাম বা ডান দিক থেকে সরানো হচ্ছে (প্রথম বা শেষ ঘটনা)।
  • CaSe সংবেদনশীলতা।
  • অনুসন্ধানের চর / স্ট্রিংটি পাওয়া না গেলে মূল স্ট্রিংটি আনল্যাটার্টে ফিরে আসার সক্ষমতা চান।

ব্যবহার:

মূল স্ট্রিং, অনুসন্ধান চর / স্ট্রিং, ডান বা বাম দিকে শুরু করার জন্য "আর" / "এল", কেস সংবেদনশীলতার জন্য সত্য / মিথ্যা প্রেরণ করুন। উদাহরণস্বরূপ, "এখানে" কেস সংবেদনশীল, স্ট্রিংয়ের জন্য অনুসন্ধান করুন, ডান দিকটি শুরু করুন।

echo TruncStringAfterString("Now Here Are Some Words Here Now","here","R",false);

আউটপুট হবে "এখন এখানে কিছু শব্দ"। "আর" কে "এল" তে পরিবর্তন করলে আউটপুট আসবে: "এখন"।

ফাংশনটি এখানে:

function TruncStringAfterString($origString,$truncChar,$startSide,$caseSensitive)
{
    if ($caseSensitive==true && strstr($origString,$truncChar)!==false)
    {
        // IF START RIGHT SIDE:
        if (strtoupper($startSide)=="R" || $startSide==false)
        {   // Found, strip off all chars from truncChar to end
            return substr($origString,0,strrpos($origString,$truncChar));
        }

        // IF START LEFT SIDE: 
        elseif (strtoupper($startSide)=="L" || $startSide="" || $startSide==true)
        {   // Found, strip off all chars from truncChar to end
            return strstr($origString,$truncChar,true);
        }           
    }
    elseif ($caseSensitive==false && stristr($origString,$truncChar)!==false)
    {           
        // IF START RIGHT SIDE: 
        if (strtoupper($startSide)=="R" || $startSide==false)
        {   // Found, strip off all chars from truncChar to end
            return substr($origString,0,strripos($origString,$truncChar));
        }

        // IF START LEFT SIDE: 
        elseif (strtoupper($startSide)=="L" || $startSide="" || $startSide==true)
        {   // Found, strip off all chars from truncChar to end
            return stristr($origString,$truncChar,true);
        }
    }       
    else
    {   // NOT found - return origString untouched
        return $origString;     // Nothing to do here
    }           

}

আপনি যদি আমার কার্যকরী উত্তরকে হ্রাস করেন তবে এটি আপনার প্রশংসিত হবে কারণ আপনি কেন বলেছেন।
রবার্ট মাউরো

0

স্ট্রাস্টার ফাংশনটি ব্যবহার করুন ।

<?php
$myString = "Posted On April 6th By Some Dude";
$result = strstr($myString, 'By', true);

echo $result ;

তৃতীয় প্যারামিটারটি trueদ্বিতীয় প্যারামিটারের প্রথম উপস্থিতির আগে ফাংশনটিকে সবকিছু ফিরিয়ে আনতে বলে।


1
strtok($str, 'By')আরও সহজ দেখাচ্ছে
mu3

-2
$variable = substr($initial, 0, strpos($initial, "By"));

if (!empty($variable)) { echo $variable; } else { echo $initial; }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.