PHP में दो तारों के बीच एक विकल्प कैसे प्राप्त करें?


142

मुझे एक फ़ंक्शन की आवश्यकता है जो दो शब्दों (या दो वर्णों) के बीच विकल्प को लौटाता है। मैं सोच रहा हूं कि क्या कोई php फ़ंक्शन है जो इसे प्राप्त करता है। मैं रेगेक्स के बारे में नहीं सोचना चाहता (ठीक है, मैं एक कर सकता था लेकिन वास्तव में नहीं लगता कि यह जाने का सबसे अच्छा तरीका है)। strposऔर substrकार्यों की सोच । यहाँ एक उदाहरण है:

$string = "foo I wanna a cake foo";

हम फ़ंक्शन को कॉल करते हैं: $substring = getInnerSubstring($string,"foo");
यह रिटर्न करता है: "मैं एक केक चाहता हूं"।

अग्रिम में धन्यवाद।

अद्यतन: ठीक है, अब तक, मैं सिर्फ एक स्ट्रिंग में दो शब्दों का एक विकल्प getInnerSubstring($str,$delim)शर्त लगा सकता हूं, क्या आप मुझे थोड़ा आगे जाने की अनुमति देते हैं और पूछते हैं कि क्या मैं किसी भी तार के उपयोग का विस्तार कर सकता हूं जो कि डेलिम मूल्य के बीच है, उदाहरण:

$string =" foo I like php foo, but foo I also like asp foo, foo I feel hero  foo";

मुझे एक सरणी मिलती है {"I like php", "I also like asp", "I feel hero"}


2
यदि आप पहले से ही Laravel का उपयोग कर रहे हैं, \Illuminate\Support\Str::between('This is my name', 'This', 'name');तो सुविधाजनक है। laravel.com/docs/7.x/helpers#method-str-between
रायन

जवाबों:


324

अगर तार अलग हैं (यानी: [foo] & [/ foo]), तो जस्टिन कुक के इस पोस्ट पर एक नज़र डालें । मैं उनके कोड को नीचे कॉपी करता हूं:

function get_string_between($string, $start, $end){
    $string = ' ' . $string;
    $ini = strpos($string, $start);
    if ($ini == 0) return '';
    $ini += strlen($start);
    $len = strpos($string, $end, $ini) - $ini;
    return substr($string, $ini, $len);
}

$fullstring = 'this is my [tag]dog[/tag]';
$parsed = get_string_between($fullstring, '[tag]', '[/tag]');

echo $parsed; // (result = dog)

7
इस फंक को शुरू और अंत के समावेशी होने के लिए संशोधित किया गया है। <code> function string_between ($ string, $ start, $ end, $ समावेशी = गलत) {$ string = ""। $ string; $ ini = strpos ($ string, $ start); अगर ($ ini == 0) वापसी ""; अगर ($ समावेशी) $ ini + = strlen ($ start); $ len = strpos ($ string, $ end, $ ini) - $ ini; if ($ समावेशी) $ len + = strlen ($ end); वापसी पदार्थ ($ स्ट्रिंग, $ आईएन, $ लेन); } </ code>
हेनरी

2
क्या इस फ़ंक्शन को विस्तारित करना संभव है ताकि यह दो तार वापस दे सके? मान लीजिए कि मेरे पास "[टैग] कुत्तों [/ टैग] और [टैग] बिल्लियों [/ टैग]" का एक $ फ़ुलस्ट्रिंग है और मुझे एक सरणी वापस चाहिए जिसमें "कुत्ते" और "बिल्लियाँ" हों।
२१:३६ पर लियोनार्ड शूएट्ज़ २

1
@LeardardSchuetz - इस उत्तर को तब आज़माएँ ।
लेमनक्स

"[टैग] कुत्तों [/ टैग] और [टैग] बिल्लियों [/ टैग]" अभी भी जवाब नहीं दिया। सरणी रूप में "कुत्ते" और "बिल्लियों" कैसे प्राप्त करें? कृपया सलाह दें।
रोमनिक सुस

1
किसी ने मेरे सवाल का जवाब दिया! आप इस stackoverflow.com/questions/35168463/…
Romnick Susa

79

नियमित अभिव्यक्ति जाने का तरीका है:

$str = 'before-str-after';
if (preg_match('/before-(.*?)-after/', $str, $match) == 1) {
    echo $match[1];
}

onlinePhp


1
यह एकदम सही था। धन्यवाद!
काइल के

यह बहुत अच्छा काम करता है! और लोगों को regEx के लिए इस्तेमाल नहीं करने के लिए, विशेष वर्णों से बचने के लिए बस "\" जोड़ें: sandbox.onlinephpfunctions.com/code/…
JCarlosR

यदि आपको कई आवृत्तियों की आवश्यकता है, तो इसे एक मल्टी
user1424074

22
function getBetween($string, $start = "", $end = ""){
    if (strpos($string, $start)) { // required if $start not exist in $string
        $startCharCount = strpos($string, $start) + strlen($start);
        $firstSubStr = substr($string, $startCharCount, strlen($string));
        $endCharCount = strpos($firstSubStr, $end);
        if ($endCharCount == 0) {
            $endCharCount = strlen($firstSubStr);
        }
        return substr($firstSubStr, 0, $endCharCount);
    } else {
        return '';
    }
}

नमूना उपयोग:

echo getBetween("abc","a","c"); // returns: 'b'

echo getBetween("hello","h","o"); // returns: 'ell'

echo getBetween("World","a","r"); // returns: ''

5
BTW, आपका "नमूना उपयोग" पैराग्राफ गलत है। तर्क पूरी तरह से गलत क्रम में हैं।
वह-बेन

15
function getInnerSubstring($string,$delim){
    // "foo a foo" becomes: array(""," a ","")
    $string = explode($delim, $string, 3); // also, we only need 2 items at most
    // we check whether the 2nd is set and return it, otherwise we return an empty string
    return isset($string[1]) ? $string[1] : '';
}

उपयोग का उदाहरण:

var_dump(getInnerSubstring('foo Hello world foo','foo'));
// prints: string(13) " Hello world "

यदि आप आसपास के व्हाट्सएप को हटाना चाहते हैं, तो उपयोग करें trim। उदाहरण:

var_dump(trim(getInnerSubstring('foo Hello world foo','foo')));
// prints: string(11) "Hello world"

1
यह साफ-सुथरा है क्योंकि यह एक-लाइनर है, लेकिन दुर्भाग्य से यह एक अद्वितीय सीमांकक तक सीमित है, अर्थात यदि आपको "फू" और "बार" के बीच प्रतिस्थापन की आवश्यकता है, तो आपको कुछ अन्य रणनीति का उपयोग करना होगा।
मास्टाज़ी

13
function getInbetweenStrings($start, $end, $str){
    $matches = array();
    $regex = "/$start([a-zA-Z0-9_]*)$end/";
    preg_match_all($regex, $str, $matches);
    return $matches[1];
}

उदाहरण के लिए, आप निम्न उदाहरण में @@ के बीच स्ट्रिंग्स (कुंजियों) की सरणी चाहते हैं, जहां '/' बीच में नहीं गिरता है

$str = "C://@@ad_custom_attr1@@/@@upn@@/@@samaccountname@@";
$str_arr = getInbetweenStrings('@@', '@@', $str);

print_r($str_arr);

3
जब $ शुरू या $ अंत चर हो तो "/" जैसे "\" से बचना न भूलें।
लोबो रेम्प्लाइक

10

दो बार स्ट्रॉ php फ़ंक्शन का उपयोग करें।

$value = "This is a great day to be alive";
$value = strstr($value, "is"); //gets all text from needle on
$value = strstr($value, "be", true); //gets all text before needle
echo $value;

आउटपुट: "is a great day to"


8

मैं नियमित अभिव्यक्ति समाधान पसंद करता हूं, लेकिन दूसरों में से कोई भी मुझे सूट नहीं करता है।

यदि आप जानते हैं कि केवल 1 परिणाम होने वाला है, तो आप निम्नलिखित का उपयोग कर सकते हैं:

$between = preg_replace('/(.*)BEFORE(.*)AFTER(.*)/sm', '\2', $string);

वांछित परिसीमाओं से पहले और बाद में बदलें।

यह भी ध्यान रखें कि मिलान नहीं होने की स्थिति में यह फ़ंक्शन पूरी स्ट्रिंग लौटाएगा।

यह समाधान बहुस्तरीय है लेकिन आप अपनी आवश्यकताओं के आधार पर संशोधक के साथ खेल सकते हैं।


7

एक php समर्थक नहीं। लेकिन मैं हाल ही में इस दीवार में भी भाग गया और यही मैं साथ आया।

function tag_contents($string, $tag_open, $tag_close){
   foreach (explode($tag_open, $string) as $key => $value) {
       if(strpos($value, $tag_close) !== FALSE){
            $result[] = substr($value, 0, strpos($value, $tag_close));;
       }
   }
   return $result;
}

$string = "i love cute animals, like [animal]cat[/animal],
           [animal]dog[/animal] and [animal]panda[/animal]!!!";

echo "<pre>";
print_r(tag_contents($string , "[animal]" , "[/animal]"));
echo "</pre>";

//result
Array
(
    [0] => cat
    [1] => dog
    [2] => panda
)

6

यदि आप fooएक सीमांकक के रूप में उपयोग कर रहे हैं , तो देखेंexplode()


हाँ, हम विस्फोटित सरणी के 1 सूचकांक का उपयोग करके आवश्यक परिणाम प्राप्त कर सकते हैं। (शून्य नहीं)।
Captain_a

6
<?php
  function getBetween($content,$start,$end){
    $r = explode($start, $content);
    if (isset($r[1])){
        $r = explode($end, $r[1]);
        return $r[0];
    }
    return '';
  }
?>

उदाहरण:

<?php 
  $content = "Try to find the guy in the middle with this function!";
  $start = "Try to find ";
  $end = " with this function!";
  $output = getBetween($content,$start,$end);
  echo $output;
?>

यह "बीच में आदमी" लौटेगा।


3

यदि आपके पास एक स्ट्रिंग से कई पुनरावृत्तियां हैं और आपके पास अलग-अलग [प्रारंभ] और [\ अंत] पैटर्न है। यहाँ एक फ़ंक्शन है जो एक सरणी का उत्पादन करता है।

function get_string_between($string, $start, $end){
    $split_string       = explode($end,$string);
    foreach($split_string as $data) {
         $str_pos       = strpos($data,$start);
         $last_pos      = strlen($data);
         $capture_len   = $last_pos - $str_pos;
         $return[]      = substr($data,$str_pos+1,$capture_len);
    }
    return $return;
}

3

यहाँ एक समारोह है

function getInnerSubstring($string, $boundstring, $trimit=false) {
    $res = false;
    $bstart = strpos($string, $boundstring);
    if ($bstart >= 0) {
        $bend = strrpos($string, $boundstring);
        if ($bend >= 0 && $bend > $bstart)
            $res = substr($string, $bstart+strlen($boundstring), $bend-$bstart-strlen($boundstring));
    }
    return $trimit ? trim($res) : $res;
}

इसका उपयोग करें

$string = "foo I wanna a cake foo";
$substring = getInnerSubstring($string, "foo");

echo $substring;

आउटपुट (ध्यान दें कि अगर यह मौजूद है और आपके स्ट्रिंग के सामने और पीछे मौजूद है)

मैं एक केक चाहता हूँ

यदि आप परिणाम उपयोग फ़ंक्शन को ट्रिम करना चाहते हैं जैसे

$substring = getInnerSubstring($string, "foo", true);

परिणाम : यदि केवल एक बार में मौजूद है या नहीं मिला है, तो यह फ़ंक्शन गलत वापस आ जाएगा , अन्यथा यह पहली और अंतिम घटना के बीच प्रतिस्थापन करता है ।$boundstring$string$boundstring$string$boundstring$string


संदर्भ


आप कोष्ठक के बिना एक-खंड का उपयोग कर रहे हैं, लेकिन आप शायद जानते हैं कि यह एक बुरा विचार है?
xmoex

@xmoex, IFआप किस खंड के बारे में बात कर रहे हैं? हो सकता है कि मैंने कुछ टाइपो बनाया हो, लेकिन ईमानदार होने के लिए, मैं अभी कुछ भी अजीब नहीं देख सकता। दोनों IFमैं ऊपर फ़ंक्शन में उपयोग किया है उचित स्थिति के आसपास कोष्ठक है। पहले IFभी घुंघराले कोष्ठक (ब्रेसिज़) हैं जो 2 लाइनों ब्लॉक को घेरते हैं, 2 IFको 'एम' की आवश्यकता नहीं है क्योंकि यह सिंगल लाइन कोड है। मुझे क्या याद आ रहा है?
WhT3h4Ck5

मैं सिंगल लाइन की बात कर रहा हूं। मुझे लगा कि आपकी पोस्ट के संपादक ने इसे मिटा दिया है, लेकिन फिर मैंने देखा कि यह पहले स्थान पर नहीं था। imvho यह कभी-कभी बग को खोजने के लिए कठिन होता है यदि आप भविष्य में कोड बदलते हैं।
xmoex

@xmoex अत्यधिक असहमत। व्यवसाय में लगभग 20 वर्षों के बाद मैं कह सकता हूं कि ब्रेस बग्स का अत्यंत दुर्लभ कारण हैं (वैसे भी उचित इंडक्शन की आवश्यकता होती है)। ब्रेसिज़ के साथ सिंगल लाइन चारों ओर से बदसूरत है (राय की बात) और कोड को बड़ा (तथ्य की बात) बनाएं। कोड पूरा होने पर अनावश्यक ब्रेसिज़ निकालने वाली अधिकांश कंपनियों में आवश्यक है। सच है, अनुभवहीन उपयोगकर्ताओं के लिए डिबगिंग के दौरान स्पॉट करना मुश्किल हो सकता है लेकिन यह वैश्विक समस्या नहीं है, बस उनके सीखने के मार्ग पर एक कदम है। मुझे व्यक्तिगत रूप से, ब्रेसिज़ के साथ बड़ी समस्याएं नहीं थीं, यहां तक ​​कि जटिल घोंसले के शिकार के मामले में भी।
1T3h4Ck5

@ Wh1T3h4Ck5 मैं आपकी राय और आपके अनुभवों का सम्मान करता हूं, लेकिन मैं बिल्कुल भी आश्वस्त नहीं हूं। ब्रेसेस कोड को सिस्टम के दृष्टिकोण से बड़ा नहीं बनाते हैं। यह फ़ाइल का आकार बढ़ाता है, लेकिन संकलक क्या परवाह करता है? और अगर js का उपयोग करते हैं तो आप लाइव होने से पहले स्वचालित रूप से बदसूरत कोड का उपयोग करेंगे। मुझे लगता है कि ब्रेसिज़ का उपयोग करना हमेशा कम दर्द होता है, फिर उन्हें "कभी-कभी" छोड़ देना ...
xmoex

3

अलेजांद्रो के उत्तर में सुधार । आप $startया $endतर्कों को खाली छोड़ सकते हैं और यह स्ट्रिंग की शुरुआत या अंत का उपयोग करेगा।

echo get_string_between("Hello my name is bob", "my", ""); //output: " name is bob"

private function get_string_between($string, $start, $end){ // Get
    if($start != ''){ //If $start is empty, use start of the string
        $string = ' ' . $string;
        $ini = strpos($string, $start);
        if ($ini == 0) return '';
        $ini += strlen($start);
    }
    else{
        $ini = 0;
    }

    if ($end == '') { //If $end is blank, use end of string
        return substr($string, $ini);
    }
    else{
        $len = strpos($string, $end, $ini) - $ini; //Work out length of string
        return substr($string, $ini, $len);
    }
}

1

उपयोग:

<?php

$str = "...server daemon started with pid=6849 (parent=6848).";
$from = "pid=";
$to = "(";

echo getStringBetween($str,$from,$to);

function getStringBetween($str,$from,$to)
{
    $sub = substr($str, strpos($str,$from)+strlen($from),strlen($str));
    return substr($sub,0,strpos($sub,$to));
}

?>

1

गार्सियावेबडेव और हेनरी वांग से थोड़ा सुधार हुआ कोड। यदि खाली $ शुरुआत या $ अंत दिया जाता है, तो फ़ंक्शन शुरुआत से या $ स्ट्रिंग के अंत तक मान लौटाता है। समावेशी विकल्प भी उपलब्ध है, चाहे हम खोज परिणाम को शामिल करना चाहते हैं या नहीं:

function get_string_between ($string, $start, $end, $inclusive = false){
    $string = " ".$string;

    if ($start == "") { $ini = 0; }
    else { $ini = strpos($string, $start); }

    if ($end == "") { $len = strlen($string); }
    else { $len = strpos($string, $end, $ini) - $ini;}

    if (!$inclusive) { $ini += strlen($start); }
    else { $len += strlen($end); }

    return substr($string, $ini, $len);
}

1

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

यहाँ उसके समाधान के मेरे परिवर्तन हैं:

function get_string_between ($string, $start, $end, $inclusive = false){
    $string = " ".$string;

    if ($start == "") { $ini = 0; }
    else { $ini = strpos($string, $start); }

    if ($end == "") { $len = strlen($string); }
    else { $len = strpos($string, $end, $ini) - $ini - strlen($start);}

    if (!$inclusive) { $ini += strlen($start); }
    else { $len += strlen($end); }

    return substr($string, $ini, $len);
}

greetz

वी


1

यह कोशिश करो, मेरे लिए इसका काम, परीक्षण शब्द के बीच डेटा मिलता है।

$str = "Xdata test HD01 test 1data";  
$result = explode('test',$str);   
print_r($result);
echo $result[1];

1

PHP के strposस्टाइल में यह तब आएगा falseजब स्टार्ट मार्क smया एंड मार्कem नहीं ।

यह परिणाम ( false) एक खाली स्ट्रिंग से अलग है जो कि आपको मिलता है यदि प्रारंभ और अंत के निशान के बीच कुछ भी नहीं है।

function between( $str, $sm, $em )
{
    $s = strpos( $str, $sm );
    if( $s === false ) return false;
    $s += strlen( $sm );
    $e = strpos( $str, $em, $s );
    if( $e === false ) return false;
    return substr( $str, $s, $e - $s );
}

फ़ंक्शन केवल पहला मैच लौटाएगा।

यह स्पष्ट है लेकिन यह ध्यान देने योग्य है कि फ़ंक्शन पहले smऔर फिर के लिए दिखेगाem

तात्पर्य यह है कि यदि आपको emपहले खोजा जाना है तो वांछित परिणाम / व्यवहार नहीं मिल सकता है और फिर खोज के लिए स्ट्रिंग को पीछे की ओर खींचना पड़ता है sm


1

यह वह फ़ंक्शन है जो मैं इसके लिए उपयोग कर रहा हूं। मैंने एकल या एकाधिक सीमांकक के लिए एक फ़ंक्शन में दो उत्तरों को संयोजित किया।

function getStringBetweenDelimiters($p_string, $p_from, $p_to, $p_multiple=false){
    //checking for valid main string  
    if (strlen($p_string) > 0) {
        //checking for multiple strings 
        if ($p_multiple) {
            // getting list of results by end delimiter
            $result_list = explode($p_to, $p_string);
            //looping through result list array 
            foreach ( $result_list AS $rlkey => $rlrow) {
                // getting result start position
                $result_start_pos   = strpos($rlrow, $p_from);
                // calculating result length
                $result_len         =  strlen($rlrow) - $result_start_pos;

                // return only valid rows
                if ($result_start_pos > 0) {
                    // cleanying result string + removing $p_from text from result
                    $result[] =   substr($rlrow, $result_start_pos + strlen($p_from), $result_len);                 
                }// end if 
            } // end foreach 

        // if single string
        } else {
            // result start point + removing $p_from text from result
            $result_start_pos   = strpos($p_string, $p_from) + strlen($p_from);
            // lenght of result string
            $result_length      = strpos($p_string, $p_to, $result_start_pos);
            // cleaning result string
            $result             = substr($p_string, $result_start_pos+1, $result_length );
        } // end if else 
    // if empty main string
    } else {
        $result = false;
    } // end if else 

    return $result;


} // end func. get string between

सरल उपयोग के लिए (दो रिटर्न):

$result = getStringBetweenDelimiters(" one two three ", 'one', 'three');

परिणाम तालिका में प्रत्येक पंक्ति प्राप्त करने के लिए:

$result = getStringBetweenDelimiters($table, '<tr>', '</tr>', true);

1

मैं उपयोग करता हूं

if (count(explode("<TAG>", $input))>1){
      $content = explode("</TAG>",explode("<TAG>", $input)[1])[0];
}else{
      $content = "";
}

सबटाइटल <TAG> जो भी परिसीमन आप चाहते हैं, उसके लिए।


1

एलेजांद्रो गार्सिया इग्लेसियस ने जो किया उसका एक संपादित संस्करण।

यह आपको उस स्ट्रिंग का एक विशिष्ट स्थान चुनने की अनुमति देता है जिसे आप परिणाम प्राप्त करने की संख्या के आधार पर प्राप्त करना चाहते हैं।

function get_string_between_pos($string, $start, $end, $pos){
    $cPos = 0;
    $ini = 0;
    $result = '';
    for($i = 0; $i < $pos; $i++){
      $ini = strpos($string, $start, $cPos);
      if ($ini == 0) return '';
      $ini += strlen($start);
      $len = strpos($string, $end, $ini) - $ini;
      $result = substr($string, $ini, $len);
      $cPos = $ini + $len;
    }
    return $result;
  }

उपयोग:

$text = 'string has start test 1 end and start test 2 end and start test 3 end to print';

//get $result = "test 1"
$result = $this->get_string_between_pos($text, 'start', 'end', 1);

//get $result = "test 2"
$result = $this->get_string_between_pos($text, 'start', 'end', 2);

//get $result = "test 3"
$result = $this->get_string_between_pos($text, 'start', 'end', 3);

strpos के पास एक विशिष्ट बिंदु पर अपनी खोज शुरू करने के लिए एक अतिरिक्त वैकल्पिक इनपुट है। इसलिए मैं $ cPos में पिछली स्थिति को संग्रहीत करता हूं ताकि जब लूप की फिर से जाँच हो, तो यह उस स्थान के अंत में शुरू होता है जहाँ से इसे छोड़ा गया था।


1

यहाँ उत्तर का एक विशाल हिस्सा संपादित भाग का उत्तर नहीं देता है, मुझे लगता है कि उन्हें पहले जोड़ा गया था। यह रेगेक्स के साथ किया जा सकता है, क्योंकि एक उत्तर में उल्लेख है। मेरा एक अलग दृष्टिकोण था।


यह फ़ंक्शन $ स्ट्रिंग खोजता है और बीच में पहला स्ट्रिंग पाता है $ ऑफसेट स्थिति से शुरू होने वाले $ स्टार्ट और $ एंड । यह परिणाम की शुरुआत की ओर इशारा करने के लिए $ ऑफसेट स्थिति को अद्यतन करता है। यदि $ डिल्डिमिटर सत्य है, तो इसमें परिणाम में सीमांकक शामिल हैं।

यदि $ स्टार्ट या $ एंड स्ट्रिंग नहीं मिलती है, तो यह अशक्त हो जाता है। अगर $ स्ट्रिंग, $ शुरुआत, या $ अंत एक खाली स्ट्रिंग है तो यह भी अशक्त है।

function str_between(string $string, string $start, string $end, bool $includeDelimiters = false, int &$offset = 0): ?string
{
    if ($string === '' || $start === '' || $end === '') return null;

    $startLength = strlen($start);
    $endLength = strlen($end);

    $startPos = strpos($string, $start, $offset);
    if ($startPos === false) return null;

    $endPos = strpos($string, $end, $startPos + $startLength);
    if ($endPos === false) return null;

    $length = $endPos - $startPos + ($includeDelimiters ? $endLength : -$startLength);
    if (!$length) return '';

    $offset = $startPos + ($includeDelimiters ? 0 : $startLength);

    $result = substr($string, $offset, $length);

    return ($result !== false ? $result : null);
}

निम्न फ़ंक्शन सभी स्ट्रिंग्स को ढूंढता है जो दो स्ट्रिंग्स (कोई ओवरलैप्स) के बीच हैं । इसके लिए पिछले फ़ंक्शन की आवश्यकता है, और तर्क समान हैं। निष्पादन के बाद, अंतिम परिणाम परिणाम स्ट्रिंग की शुरुआत में $ ऑफसेट अंक।

function str_between_all(string $string, string $start, string $end, bool $includeDelimiters = false, int &$offset = 0): ?array
{
    $strings = [];
    $length = strlen($string);

    while ($offset < $length)
    {
        $found = str_between($string, $start, $end, $includeDelimiters, $offset);
        if ($found === null) break;

        $strings[] = $found;
        $offset += strlen($includeDelimiters ? $found : $start . $found . $end); // move offset to the end of the newfound string
    }

    return $strings;
}

उदाहरण:

str_between_all('foo 1 bar 2 foo 3 bar', 'foo', 'bar') देता है [' 1 ', ' 3 ']

str_between_all('foo 1 bar 2', 'foo', 'bar') देता है [' 1 ']

str_between_all('foo 1 foo 2 foo 3 foo', 'foo', 'foo') देता है [' 1 ', ' 3 ']

str_between_all('foo 1 bar', 'foo', 'foo')देता है []


0

उपयोग:

function getdatabetween($string, $start, $end){
    $sp = strpos($string, $start)+strlen($start);
    $ep = strpos($string, $end)-strlen($start);
    $data = trim(substr($string, $sp, $ep));
    return trim($data);
}
$dt = "Find string between two strings in PHP";
echo getdatabetween($dt, 'Find', 'in PHP');

0

मुझे यहाँ इस्तेमाल होने वाले get_string_between () फ़ंक्शन के साथ कुछ समस्याएं थीं। इसलिए मैं अपने संस्करण के साथ आया। हो सकता है कि यह मेरे जैसे ही मामले में लोगों की मदद कर सके।

protected function string_between($string, $start, $end, $inclusive = false) { 
   $fragments = explode($start, $string, 2);
   if (isset($fragments[1])) {
      $fragments = explode($end, $fragments[1], 2);
      if ($inclusive) {
         return $start.$fragments[0].$end;
      } else {
         return $fragments[0];
      }
   }
   return false;
}

0

इन कुछ समय पहले लिखा था, यह अनुप्रयोगों की एक विस्तृत श्रृंखला के लिए बहुत उपयोगी है।

<?php

// substr_getbykeys() - Returns everything in a source string that exists between the first occurance of each of the two key substrings
//          - only returns first match, and can be used in loops to iterate through large datasets
//          - arg 1 is the first substring to look for
//          - arg 2 is the second substring to look for
//          - arg 3 is the source string the search is performed on.
//          - arg 4 is boolean and allows you to determine if returned result should include the search keys.
//          - arg 5 is boolean and can be used to determine whether search should be case-sensative or not.
//

function substr_getbykeys($key1, $key2, $source, $returnkeys, $casematters) {
    if ($casematters === true) {
        $start = strpos($source, $key1);
        $end = strpos($source, $key2);
    } else {
        $start = stripos($source, $key1);
        $end = stripos($source, $key2);
    }
    if ($start === false || $end === false) { return false; }
    if ($start > $end) {
        $temp = $start;
        $start = $end;
        $end = $temp;
    }
    if ( $returnkeys === true) {
        $length = ($end + strlen($key2)) - $start;
    } else {
        $start = $start + strlen($key1);
        $length = $end - $start;
    }
    return substr($source, $start, $length);
}

// substr_delbykeys() - Returns a copy of source string with everything between the first occurance of both key substrings removed
//          - only returns first match, and can be used in loops to iterate through large datasets
//          - arg 1 is the first key substring to look for
//          - arg 2 is the second key substring to look for
//          - arg 3 is the source string the search is performed on.
//          - arg 4 is boolean and allows you to determine if returned result should include the search keys.
//          - arg 5 is boolean and can be used to determine whether search should be case-sensative or not.
//

function substr_delbykeys($key1, $key2, $source, $returnkeys, $casematters) {
    if ($casematters === true) {
        $start = strpos($source, $key1);
        $end = strpos($source, $key2);
    } else {
        $start = stripos($source, $key1);
        $end = stripos($source, $key2);
    }
    if ($start === false || $end === false) { return false; }
    if ($start > $end) {
        $temp = $start; 
        $start = $end;
        $end = $temp;
    }
    if ( $returnkeys === true) {
        $start = $start + strlen($key1);
        $length = $end - $start;
    } else {
        $length = ($end + strlen($key2)) - $start;  
    }
    return substr_replace($source, '', $start, $length);
}
?>

0

कुछ त्रुटि पकड़ने के साथ। विशेष रूप से, प्रस्तुत अधिकांश कार्यों के लिए $ अंत की आवश्यकता होती है, जब वास्तव में मेरे मामले में मुझे वैकल्पिक होने की आवश्यकता थी। यह प्रयोग $ अंत वैकल्पिक है, और FALSE के लिए मूल्यांकन अगर $ शुरू बिल्कुल मौजूद नहीं है:

function get_string_between( $string, $start, $end ){
    $string = " " . $string;
    $start_ini = strpos( $string, $start );
    $end = strpos( $string, $end, $start+1 );
    if ($start && $end) {
        return substr( $string, $start_ini + strlen($start), strlen( $string )-( $start_ini + $end ) );
    } elseif ( $start && !$end ) {
        return substr( $string, $start_ini + strlen($start) );
    } else {
        return FALSE;
    }

}

0

UTF-8 संस्करण @Alejandro Iglesias उत्तर, गैर-लैटिन वर्णों के लिए काम करेगा:

function get_string_between($string, $start, $end){
    $string = ' ' . $string;
    $ini = mb_strpos($string, $start, 0, 'UTF-8');
    if ($ini == 0) return '';
    $ini += mb_strlen($start, 'UTF-8');
    $len = mb_strpos($string, $end, $ini, 'UTF-8') - $ini;
    return mb_substr($string, $ini, $len, 'UTF-8');
}

$fullstring = 'this is my [tag]dog[/tag]';
$parsed = get_string_between($fullstring, '[tag]', '[/tag]');

echo $parsed; // (result = dog)

0

Tonyspiro से इसके लिए सबसे अच्छा समाधान मिला

function getBetween($content,$start,$end){
   $r = explode($start, $content);
   if (isset($r[1])){
       $r = explode($end, $r[1]);
       return $r[0];
   }
   return '';
}

0

इस छोटे से कार्य का उपयोग करके इसे आसानी से किया जा सकता है:

function getString($string, $from, $to) {
    $str = explode($from, $string);
    $str = explode($to, $str[1]);
    return $s[0];
}
$myString = "<html>Some code</html>";
print getString($myString, '<html>', '</html>');

// Prints: Some code

-1

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

Grabstring ("टेस्ट स्ट्रिंग", "", "", 0) टेस्ट स्ट्रिंग
रिटर्नस्ट्रिंग ("टेस्ट स्ट्रिंग", "टेस्ट", "", 0) रिटर्न स्ट्रिंग स्ट्रिंग
("टेस्ट स्ट्रिंग", "s", "" ) लौटाता है । 5) रिटर्न स्ट्रिंग

function grabstring($strSource,$strPre,$strPost,$StartAt) {
if(@strpos($strSource,$strPre)===FALSE && $strPre!=""){
    return("");
}
@$Startpoint=strpos($strSource,$strPre,$StartAt)+strlen($strPre);
if($strPost == "") {
    $EndPoint = strlen($strSource);
} else {
    if(strpos($strSource,$strPost,$Startpoint)===FALSE){
        $EndPoint= strlen($strSource);
    } else {
        $EndPoint = strpos($strSource,$strPost,$Startpoint);
    }
}
if($strPre == "") {
    $Startpoint = 0;
}
if($EndPoint - $Startpoint < 1) {
    return "";
} else {
        return substr($strSource, $Startpoint, $EndPoint - $Startpoint);
}

}

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