एक निश्चित चरित्र के बाद एक स्ट्रिंग का हिस्सा निकालें


144

मैं बस सोच रहा हूं कि मैं PHP में एक निश्चित सबस्ट्रिंग के बाद सब कुछ कैसे हटा सकता हूं

उदाहरण के लिए:

Posted On April 6th By Some Dude

मुझे यह पसंद है ताकि यह सभी पाठों को हटा दे, और इसके बाद, उप स्ट्रिंग "बाय"

धन्यवाद


1
क्या होगा यदि उप स्ट्रिंग दो बार (या अधिक) होती है?
बार्ट कीर्स

18
एक नोट के रूप में, यदि आप ऐसा कर रहे हैं तो आप किसी और की सामग्री ले सकते हैं और इसे अपनी साइट पर प्रस्तुत कर सकते हैं, नहीं
ceejayoz

मैं ceejayoz से सहमत हूँ। यह बहुत अच्छा लगता है जैसे आप उस सामग्री का उपयोग करने की कोशिश कर रहे हैं जिसकी आपके पास वास्तव में पहुंच नहीं है और आप मूल लेखक के किसी भी संदर्भ को हटाने की कोशिश कर रहे हैं। यह बहुत अच्छा नहीं होगा ...
23

2
वैकल्पिक महान समाधान stackoverflow.com/a/9315908/1518921 :)
गुइलेरमे नेस्सिमेंटो

1
सीएमएस द्वारा उत्पन्न सामग्री के साथ काम करते समय वैध कारणों से इस तरह का काम करना वास्तव में सामान्य है। इसका कारण यह है कि आप कभी भी वास्तविक कोड के साथ गड़बड़ नहीं करना चाहते हैं जो इस तरह से एक स्निपेट बनाता है क्योंकि आप अपने अपडेट तोड़ रहे होंगे; इसलिए, आप इसे अपनी बात करने देते हैं, फिर आप अपनी बात करते हैं।
नौसाजिमी

जवाबों:


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

सादे अंग्रेजी में: मुझे उस स्ट्रिंग का हिस्सा दें जो शुरुआत में शुरू होता है और उस स्थिति में समाप्त होता है जहां आप पहले अपराधी का सामना करते हैं।


11
के बारे में क्या "केवल अगर यह" द्वारा "मौजूद है?
एलिसो

3
आप सही हे। यदि "द्वारा" नहीं मिला है तो स्ट्रैप FALSE लौटाएगा। यदि दी गई लंबाई झूठी है तो पदार्थ एक रिक्त स्ट्रिंग लौटाएगा। व्यवहार में, यह जांचना उपयोगी होगा कि क्या "द्वारा" मौजूद है और फिर केवल ऐसा करने से यह होता है (अन्यथा केवल स्ट्रिंग को छोड़कर)।
ऑस्टिन फिट्जपैट्रिक

13
यह काम करता है: स्ट्रैप्स ($ चर, "द्वारा")? पदार्थ ($ चर, 0, strpos ($ चर, "द्वारा")): $ चर;
नूह गैरी

मैंने एक उत्तर दिया, जो मुझे लगता है कि नीचे दी गई हर बात को संबोधित करता है और सभी प्रकार की चीजों से निपटने के तरीके भी बताता है जैसे केस असंवेदनशील, कई घटनाएँ, और नियमित अभिव्यक्ति। अगर कोई और अधिक लचीला कुछ करना चाहता है या इसमें आने वाले इनपुट पर नियंत्रण नहीं है, तो शायद यह जांचने लायक है।
azoundria

1
मेरे लिए एकदम सही काम करता है @Goahnary!
डेनिस

106

यदि आप PHP 5.3+ का उपयोग कर रहे हैं, तो $ str_needle फ्लैग ऑफ़ स्ट्रैस () पर एक नज़र डालें

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

4
धन्यवाद, यह आजकल वास्तविक सही उत्तर है !
Matmarbon

59
ध्यान दें कि FALSEयदि स्ट्रिंग का भाग नहीं मिला है तो यह वापस आ जाएगा । तो समाधान हो सकता है:echo strstr($s, 'By', true) ?: $s;
kenorb

6
^ ^ ^ kenorb का उत्तर आज स्वीकृत उत्तर होना चाहिए। एक अन्य विकल्प स्क्वेयरकंडी का explode(' By', $s)[0]IMHO होगा
ज़ैक मॉरिस

वास्तव में, केनोरब का अस्तित्व जांचने का तरीका है, भले ही इसे स्ट्रिंग का परीक्षण करने की आवश्यकता न हो।
बैरीमोड

यहाँ कहने के लिए @ kenorb की विधि स्तन है।
क्विन कॉमेंडेंट

32

कैसे उपयोग करने के बारे में explode:

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

लाभ:


@bacac - जब तक यह काम करता है और मूल्यह्रास नहीं होता है तब तक पुराने जमाने के साथ क्या गलत है?
चौकोर

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

यह सबसे अच्छा उत्तर है, भले ही वह स्ट्रिंग में नहीं है, लेकिन मूल उत्तर गलत है क्योंकि doest'nt मौजूद है, यह विफल रहता है।
नीटेकनिक

यह गलत है: फ़ंक्शन By2 पैरामीटर में किसी भी वर्ण द्वारा विभाजित नहीं होगा । मतलब, यह Bया तो फूट जाएगा y। तकनीकी रूप से, यह सब कुछ एक से पहले नहीं हो रहा है By
एमएसबी

सावधान रहें: स्ट्रेटोक स्ट्रिंग के हिस्से को चरित्र के बाद लौटाएगा यदि यह स्ट्रिंग में पहला चरित्र है, जैसे, strtok('a:b', ':')वापस आ जाएगा , aलेकिन strtok(':b', ':')वापस आ जाएगा b, जैसा कि आप अपेक्षा नहीं करेंगे।
क्विन कॉमेंडेंट

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",",");
?>

आप sas के बजाय फ़ंक्शन स्ट्रिप_after_string का नामकरण करना बेहतर होगा और क्रिप्टोकरेंसी के कोड से भरा कोड आधार होना चाहिए। हालांकि यह इस सवाल का सबसे पसंदीदा जवाब है।
एंथर

5

ऑस्टिन का जवाब आपके उदाहरण के मामले में काम करता है।

आम तौर पर, आप नियमित अभिव्यक्ति कार्यों को देखने के लिए अच्छी तरह से करते हैं, जब आप जिस स्ट्रिंग पर विभाजन कर रहे हैं वह स्ट्रिंग के बीच भिन्न हो सकती है:

$ चर = preg_replace ('/ by। * /', '', $ चर);

+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

नीचे सबसे कारगर विधि (रन-टाइम) के द्वारा पहली बार तब जब सब कुछ काट रहा है के द्वारा एक स्ट्रिंग में। यदि तक मौजूद नहीं है, संपूर्ण स्ट्रिंग दिया जाता है। परिणाम $ sResult में है।

$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"

यदि आप केस संवेदी नहीं होना चाहते हैं, तो स्ट्रैप के बजाय स्ट्रिप का उपयोग करें । यदि आपको लगता है करके एक बार से अधिक मौजूद हो सकता है और अंतिम बार होने के बाद कटौती सब कुछ, उपयोग करना चाहते हैं strrpos

नीचे एक कम कुशल विधि है लेकिन यह कम कोड स्थान लेता है। यह विधि अधिक लचीली भी है और आपको कोई भी नियमित अभिव्यक्ति करने की अनुमति देती है।

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

लेकिन यहाँ भी एक बहुत शक्तिशाली तरीका है जिसे आप preg_match का उपयोग करने के लिए कर सकते हैं कि आप क्या करने की कोशिश कर रहे हैं:

$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

क्यों...

यह ज्यादातर लोगों की ज़रूरतों के लिए ओवरकिल है, लेकिन, यह कई चीजों को संबोधित करता है, जो ऊपर प्रत्येक व्यक्ति का जवाब नहीं है। जिन वस्तुओं को यह संबोधित करता है, उनमें से तीन मेरी जरूरतों के लिए आवश्यक थीं। तंग ब्रैकेट और टिप्पणियों को छोड़ने के साथ, यह अभी भी कोड की केवल 13 लाइनों पर पठनीय रह सकता है।

यह निम्नलिखित को संबोधित करता है:

  • REGEX बनाम स्ट्रैप / स्ट्रेट / स्ट्र्रीपोज़ / स्ट्रिस्टर का उपयोग करने का प्रदर्शन प्रभाव।
  • जब स्ट्रिंग / स्ट्रिंग स्ट्रिंग में नहीं मिलती है तो स्ट्रारीपोज़ / स्ट्रैप का उपयोग करना।
  • स्ट्रिंग (पहली या अंतिम घटना) के बाईं या दाईं ओर से हटाना।
  • मामले की संवेदनशीलता।
  • यदि खोज चार / स्ट्रिंग नहीं मिला तो मूल स्ट्रिंग वापस लौटाने की क्षमता चाहते हैं।

उपयोग:

मूल स्ट्रिंग, खोज चार / स्ट्रिंग, "R" / "L" को दाईं या बाईं ओर से शुरू करने के लिए भेजें, केस सेंसिटिविटी के लिए सही / गलत। उदाहरण के लिए, "असंवेदनशील" केस असंवेदनशील, स्ट्रिंग में, राइट साइड से खोजें।

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

आउटपुट "अब यहां कुछ शब्द हैं"। "R" को "L" में बदलने से आउटपुट: "Now" होगा।

यहाँ समारोह है:

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

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