Bagaimana cara mendapatkan substring antara dua string dalam PHP?

142

Saya membutuhkan fungsi yang mengembalikan substring antara dua kata (atau dua karakter). Saya bertanya-tanya apakah ada fungsi php yang mencapai itu. Saya tidak ingin berpikir tentang regex (well, saya bisa melakukan satu tetapi benar-benar tidak berpikir itu cara terbaik untuk pergi). Pemikiran strposdan substrfungsi. Ini sebuah contoh:

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

Kami memanggil fungsi: $substring = getInnerSubstring($string,"foo");
Ini mengembalikan: "Saya ingin kue".

Terima kasih sebelumnya.

Pembaruan: Ya, sampai sekarang, saya hanya bisa mendapatkan substring antara dua kata hanya dalam satu string, apakah Anda mengizinkan saya untuk pergi sedikit lebih jauh dan bertanya apakah saya dapat memperluas penggunaan getInnerSubstring($str,$delim)untuk mendapatkan string yang berada di antara nilai batas, contoh:

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

Saya mendapatkan array seperti {"I like php", "I also like asp", "I feel hero"}.

Nadjib Mami
sumber
2
Jika Anda sudah menggunakan Laravel, \Illuminate\Support\Str::between('This is my name', 'This', 'name');nyaman. laravel.com/docs/7.x/helpers#method-str-between
Ryan

Jawaban:

324

Jika string berbeda (yaitu: [foo] & [/ foo]), lihat posting ini dari Justin Cook. Saya menyalin kode-nya di bawah ini:

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)
Alejandro García Iglesias
sumber
7
Fungsi ini dimodifikasi agar mencakup awal dan akhir. <code> function string_between ($ string, $ start, $ end, $ inclusive = false) {$ string = "". $ string; $ ini = strpos ($ string, $ start); if ($ ini == 0) return ""; if (! $ inklusif) $ ini + = strlen ($ start); $ len = strpos ($ string, $ end, $ ini) - $ ini; if ($ inklusif) $ len + = strlen ($ end); return substr ($ string, $ ini, $ len); } </code>
Henry
2
Apakah mungkin untuk memperluas fungsi ini sehingga dapat mengembalikan dua string? Katakanlah saya memiliki $ fullstring dari "[tag] dogs [/ tag] dan [tag] cats [/ tag]" dan saya ingin array yang berisi "dogs" dan "cats".
Leonard Schuetz
1
@LeonardSchuetz - Coba jawaban ini .
leymannx
"[tag] dogs [/ tag] dan [tag] cats [/ tag]" masih belum dijawab. Bagaimana cara mendapatkan "anjing" dan "kucing" dalam bentuk array? Tolong saran.
Romnick Susa
1
Seseorang menjawab pertanyaanku! Anda dapat mengunjungi stackoverflow.com/questions/35168463/…
Romnick Susa
79

Ekspresi reguler adalah caranya:

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

onlinePhp

nkkollaw
sumber
1
Ini sempurna. Terima kasih!
Kyle K
Ini sangat bagus! Dan bagi orang yang tidak terbiasa dengan regEx, cukup tambahkan "\" untuk keluar dari karakter khusus: sandbox.onlinephpfunctions.com/code/…
JCarlosR
Jika Anda perlu beberapa kejadian, coba yang ini multi
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 '';
    }
}

Penggunaan sampel:

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

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

echo getBetween("World","a","r"); // returns: ''
daniel
sumber
5
BTW, paragraf "Contoh penggunaan" Anda salah. Argumen dalam urutan yang benar-benar salah.
that-ben
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] : '';
}

Contoh penggunaan:

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

Jika Anda ingin menghapus spasi putih di sekitarnya, gunakan trim. Contoh:

var_dump(trim(getInnerSubstring('foo Hello world foo','foo')));
// prints: string(11) "Hello world"
Kristen
sumber
1
Ini rapi karena hanya terdiri dari satu garis tetapi sayangnya terbatas untuk memiliki pembatas yang unik, yaitu jika Anda memerlukan substring antara "foo" dan "bar" Anda harus menggunakan beberapa strategi lain.
mastazi
13
function getInbetweenStrings($start, $end, $str){
    $matches = array();
    $regex = "/$start([a-zA-Z0-9_]*)$end/";
    preg_match_all($regex, $str, $matches);
    return $matches[1];
}

untuk memeriksa Anda ingin array string (kunci) antara @@ dalam contoh berikut, di mana '/' tidak termasuk di antara

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

print_r($str_arr);
Ravi Verma
sumber
3
Jangan lupa untuk keluar dari "/" seperti "\ /" ketika itu $ variabel awal atau $ end.
Luboš Remplík
10

gunakan fungsi strstr php dua kali.

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

output: "is a great day to"

Bryce
sumber
8

Saya suka solusi ekspresi reguler tapi tidak ada yang cocok untuk saya.

Jika Anda tahu hanya akan ada 1 hasil, Anda dapat menggunakan yang berikut:

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

Ubah SEBELUM dan SETELAH menjadi pembatas yang diinginkan.

Juga perlu diingat fungsi ini akan mengembalikan seluruh string jika tidak ada yang cocok.

Solusi ini multiline tetapi Anda dapat bermain dengan pengubah tergantung pada kebutuhan Anda.

ragnar
sumber
7

Bukan pro php tetapi saya baru-baru ini berlari ke tembok ini juga dan inilah yang saya hasilkan.

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
)
Light93
sumber
6

Jika Anda menggunakan foosebagai pembatas, maka lihatexplode()

wajib
sumber
Yup kita bisa mendapatkan hasil yang diperlukan dengan menggunakan indeks 1 array yang meledak. (bukan Zero).
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 '';
  }
?>

Contoh:

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

Ini akan mengembalikan "pria di tengah".

Asif Rahman
sumber
3

Jika Anda memiliki beberapa pengulangan dari satu string dan Anda memiliki pola [awal] dan [\ akhir] yang berbeda. Berikut adalah fungsi yang menampilkan array.

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;
}
noelthegreat
sumber
3

Inilah fungsinya

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

Gunakan seperti

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

echo $substring;

Output (perhatikan bahwa ia mengembalikan spasi di depan dan pada dan dari string Anda jika ada)

Saya mau kue

Jika Anda ingin memangkas hasil, gunakan fungsi seperti

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

Hasil : Fungsi ini akan mengembalikan false jika $boundstringtidak ditemukan di $stringatau jika $boundstringhanya ada sekali $string, jika tidak mengembalikan substring antara kejadian pertama dan terakhir $boundstringdi $string.


Referensi

Wh1T3h4Ck5
sumber
Anda menggunakan jika-klausa tanpa tanda kurung, tetapi Anda mungkin tahu itu adalah ide yang buruk?
xmoex
@xmoex, IFKlausa apa yang Anda bicarakan? mungkin saya membuat kesalahan ketik tapi jujur ​​saja, saya tidak bisa melihat sesuatu yang aneh sekarang. Kedua IFs saya telah digunakan dalam fungsi di atas memiliki kurung yang tepat di sekitar kondisi. Pertama IFjuga memiliki kurung keriting (kurung kurawal) yang mengelilingi 2 baris blok, ke IF- 2 tidak perlu mereka karena itu kode baris tunggal. Apa yang saya lewatkan?
Wh1T3h4Ck5
Saya sedang berbicara tentang satu baris. Saya pikir editor posting Anda menghapusnya tetapi kemudian saya melihat itu tidak ada di tempat pertama. imvho ini adalah sumber umum yang terkadang sulit ditemukan bug jika Anda mengubah kode di masa mendatang.
xmoex
@xmoex Sangat tidak setuju. Setelah hampir 20 tahun berkecimpung dalam bisnis ini, saya dapat mengatakan bahwa kawat gigi merupakan penyebab bug yang sangat langka (diperlukan indensi yang tepat). Mengitari satu baris dengan kawat gigi jelek (soal pendapat) dan membuat kode lebih besar (soal fakta). Di sebagian besar perusahaan menghapus kawat gigi yang tidak perlu diperlukan pada penyelesaian kode. Benar, mungkin sulit dikenali selama debugging untuk pengguna yang tidak berpengalaman tapi itu bukan masalah global, hanya langkah di jalur pembelajaran mereka. Saya pribadi, tidak pernah punya masalah besar dengan kawat gigi, bahkan dalam kasus bersarang yang rumit.
Wh1T3h4Ck5
@ Wh1T3h4Ck5 Saya menghargai pendapat dan pengalaman Anda, tapi saya tidak yakin sama sekali. Kawat gigi tidak membuat kode lebih besar dari sudut pandang sistem. Itu memperbesar ukuran file, tetapi apa yang dilakukan oleh kompiler? Dan jika menggunakan js Anda mungkin akan secara otomatis kode jelek sebelum ditayangkan. Saya pikir menggunakan kawat gigi selalu kurang menyakitkan daripada menghilangkan mereka "kadang-kadang" ...
xmoex
3

Peningkatan jawaban Alejandro . Anda bisa membiarkan $startatau $endargumen kosong dan itu akan menggunakan awal atau akhir dari string.

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);
    }
}
Master Rikki
sumber
1

Menggunakan:

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

?>
MaxEcho
sumber
1

Kode sedikit ditingkatkan dari GarciaWebDev dan Henry Wang. Jika $ awal kosong atau $ akhir diberikan, fungsi mengembalikan nilai dari awal atau ke akhir $ string. Juga tersedia opsi Inklusif, apakah kami ingin menyertakan hasil pencarian atau tidak:

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);
}
Julius Tilvikas
sumber
1

Saya harus menambahkan sesuatu ke pos Julius Tilvikas. Saya mencari solusi seperti ini yang dia jelaskan di posnya. Tapi saya pikir ada kesalahan. Saya tidak benar-benar mendapatkan string di antara dua string, saya juga mendapatkan lebih banyak dengan solusi ini, karena saya harus mengurangi panjang string start. Ketika melakukan ini, saya benar-benar mendapatkan String di antara dua string.

Inilah perubahan solusi saya:

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

Salam

V

Der_V
sumber
1

Coba ini, Ini berfungsi untuk saya, dapatkan data di antara kata uji .

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

Dalam strposgaya PHP ini akan kembali falsejika tanda awal smatau tanda akhirem tidak ditemukan.

Hasil ini ( false) berbeda dari string kosong yang Anda dapatkan jika tidak ada antara tanda awal dan akhir.

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

Fungsi hanya akan mengembalikan pertandingan pertama.

Jelas tetapi layak disebutkan bahwa fungsi pertama-tama akan mencari smdan kemudian untukem .

Ini berarti Anda mungkin tidak mendapatkan hasil / perilaku yang diinginkan jika emharus dicari terlebih dahulu dan kemudian string harus diurai ke belakang untuk mencari sm.

Paolo
sumber
1

Ini adalah fungsi yang saya gunakan untuk ini. Saya menggabungkan dua jawaban dalam satu fungsi untuk pembatas tunggal atau ganda.

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

Untuk penggunaan sederhana (mengembalikan dua):

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

Untuk mendapatkan setiap baris dalam tabel ke array hasil:

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

saya menggunakan

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

Ganti <TAG> untuk pembatas apa pun yang Anda inginkan.

Ángel RG
sumber
1

versi yang diedit dari apa yang dimasukkan oleh Alejandro García Iglesias.

Ini memungkinkan Anda untuk memilih lokasi spesifik dari string yang ingin Anda dapatkan berdasarkan pada berapa kali hasil ditemukan.

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

pemakaian:

$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 memiliki input opsional tambahan untuk memulai pencarian pada titik tertentu. jadi saya menyimpan posisi sebelumnya di $ cPos sehingga ketika for loop mengecek lagi, itu dimulai pada akhir dari mana ia tinggalkan.

SwiftNinjaPro
sumber
1

Sebagian besar jawaban di sini tidak menjawab bagian yang diedit, saya kira mereka ditambahkan sebelumnya. Ini dapat dilakukan dengan regex, seperti yang disebutkan dalam satu jawaban. Saya memiliki pendekatan yang berbeda.


Fungsi ini mencari $ string dan menemukan string pertama di antaranya $ start dan $ end string, mulai dari $ offset posisi. Kemudian memperbarui posisi $ ofset untuk menunjuk ke awal hasil. Jika $ includeDelimiters benar, itu termasuk pembatas dalam hasilnya.

Jika $ start atau $ end string tidak ditemukan, ia mengembalikan null. Ini juga mengembalikan null jika $ string, $ start, atau $ end adalah string kosong.

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

Fungsi berikut menemukan semua string yang berada di antara dua string (tidak ada tumpang tindih). Ini membutuhkan fungsi sebelumnya, dan argumennya sama. Setelah eksekusi, $ offset poin ke awal dari string hasil yang terakhir ditemukan.

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

Contoh:

str_between_all('foo 1 bar 2 foo 3 bar', 'foo', 'bar')memberi [' 1 ', ' 3 '].

str_between_all('foo 1 bar 2', 'foo', 'bar')memberi [' 1 '].

str_between_all('foo 1 foo 2 foo 3 foo', 'foo', 'foo')memberi [' 1 ', ' 3 '].

str_between_all('foo 1 bar', 'foo', 'foo')memberi [].

Quirinus
sumber
0

Menggunakan:

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');
Pankaj Raturi
sumber
0

Saya punya beberapa masalah dengan fungsi get_string_between (), yang digunakan di sini. Jadi saya datang dengan versi saya sendiri. Mungkin itu bisa membantu orang dalam kasus yang sama dengan saya.

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;
}
KmeCnin
sumber
0

menulis ini beberapa waktu lalu, merasa sangat berguna untuk berbagai aplikasi.

<?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);
}
?>
Dave
sumber
0

Dengan beberapa kesalahan menangkap. Secara khusus, sebagian besar fungsi yang disajikan memerlukan $ end untuk eksis, padahal dalam kasus saya, saya membutuhkannya menjadi opsional. Gunakan ini $ end adalah opsional, dan evaluasi untuk FALSE jika $ awal tidak ada sama sekali:

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

}
NotaGuruAtAll
sumber
0

Versi UTF-8 dari jawaban @Alejandro Iglesias, akan berfungsi untuk karakter non-latin:

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)
NXT
sumber
0

Dapatkan solusi terbaik untuk ini dari tonyspiro

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

Ini dapat dengan mudah dilakukan menggunakan fungsi kecil ini:

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
Coder Bosnia
sumber
-1

Saya telah menggunakan ini selama bertahun-tahun dan berfungsi dengan baik. Mungkin bisa dibuat lebih efisien, tetapi

grabstring ("Test string", "", "", 0) mengembalikan Test string
grabstring ("Test string", "Test", "", 0) mengembalikan string
grabstring ("Test string", "s", "", 5) mengembalikan string

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

}

pialang mobil
sumber