Làm thế nào để có được một chuỗi con giữa hai chuỗi trong PHP?


142

Tôi cần một hàm trả về chuỗi con giữa hai từ (hoặc hai ký tự). Tôi tự hỏi liệu có một chức năng php đạt được điều đó. Tôi không muốn nghĩ về regex (tốt, tôi có thể làm một nhưng thực sự không nghĩ rằng đó là cách tốt nhất để đi). Suy nghĩ strpossubstrchức năng. Đây là một ví dụ:

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

Chúng tôi gọi hàm: $substring = getInnerSubstring($string,"foo");
Nó trả về: "Tôi muốn một chiếc bánh".

Cảm ơn trước.

Cập nhật: Chà, cho đến bây giờ, tôi chỉ có thể nhận được một chuỗi con đặt cược hai từ chỉ trong một chuỗi, bạn có cho phép tôi đi xa hơn một chút và hỏi liệu tôi có thể mở rộng việc sử dụng getInnerSubstring($str,$delim)để có bất kỳ chuỗi nào nằm giữa giá trị delim không, thí dụ:

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

Tôi nhận được một mảng như thế nào {"I like php", "I also like asp", "I feel hero"}.


2
Nếu bạn đã sử dụng Laravel, \Illuminate\Support\Str::between('This is my name', 'This', 'name');thật tiện lợi. laravel.com/docs/7.x/helpers#method-str-b between
Ryan

Câu trả lời:


324

Nếu các chuỗi khác nhau (ví dụ: [foo] & [/ foo]), hãy xem bài đăng này từ Justin Cook. Tôi sao chép mã của anh ấy bên dưới:

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
Func này được sửa đổi để bao gồm bắt đầu và kết thúc. <code> hàm string_b between ($ string, $ start, $ end, $ inclusive = false) {$ string = "". $ string; $ ini = strpose ($ chuỗi, $ start); if ($ ini == 0) trả về ""; if (! $ đã bao gồm) $ ini + = strlen ($ start); $ len = strpose ($ chuỗi, $ end, $ ini) - $ ini; if (bao gồm $) $ len + = strlen ($ end); trả về chất nền ($ chuỗi, $ ini, $ len); } </ code>
Henry

2
Có thể mở rộng chức năng này để nó có thể trả lại hai chuỗi? Giả sử tôi có $ full chuỗi "[tag] dog [/ tag] và [tag] cat [/ tag]" và tôi muốn một mảng trở lại có chứa "dog" và "cat".
Leonard Schuetz

1
@LeonardSchuetz - Hãy thử câu trả lời này sau đó.
leymannx

"[tag] dog [/ tag] và [tag] cat [/ tag]" vẫn chưa được trả lời. Làm thế nào để có được "chó" và "mèo" ở dạng mảng? Vui lòng cho lời khuyên.
Romnick Susa

1
Ai đó đã trả lời câu hỏi của tôi! Bạn có thể truy cập stackoverflow.com/questions353168463/
Romnick Susa

78

Biểu thức thông thường là cách để đi:

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

trực tuyến


1
Điều này là hoàn hảo. Cảm ơn bạn!
Kyle K

Nó hoạt động rất tốt! Và đối với những người không quen sử dụng regEx, chỉ cần thêm "\" để thoát các ký tự đặc biệt: sandbox.onlinephpfifts.com/code/,
JCarlosR

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

Sử dụng mẫu:

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

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

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

5
BTW, đoạn "Sử dụng mẫu" của bạn là sai. Đối số là một thứ tự hoàn toàn sai.
đó là

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] : '';
}

Ví dụ sử dụng:

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

Nếu bạn muốn loại bỏ khoảng trắng xung quanh, sử dụng trim. Thí dụ:

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

1
Điều này gọn gàng vì nó là một lớp lót, nhưng thật không may, nó bị giới hạn trong việc có một dấu phân cách duy nhất, tức là nếu bạn cần chuỗi con giữa "foo" và "bar", bạn sẽ phải sử dụng một số chiến lược khác.
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];
}

để kiểm tra, bạn muốn mảng chuỗi (khóa) ở giữa @@ trong ví dụ sau, trong đó '/' không nằm ở giữa

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

print_r($str_arr);

3
Đừng quên thoát "/" như "\ /" khi đó là biến $ start hoặc $ end.
Luboš Remplík

10

sử dụng hàm strstr php hai lần.

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

đầu ra: "is a great day to"


8

Tôi thích các giải pháp biểu thức thông thường nhưng không ai trong số những người khác phù hợp với tôi.

Nếu bạn biết sẽ chỉ có 1 kết quả, bạn có thể sử dụng như sau:

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

Thay đổi TRƯỚC và SAU để phân cách mong muốn.

Ngoài ra, hãy nhớ rằng hàm này sẽ trả về toàn bộ chuỗi trong trường hợp không có gì khớp.

Giải pháp này là multiline nhưng bạn có thể chơi với các sửa đổi tùy thuộc vào nhu cầu của bạn.


7

Không phải là một pro pro. nhưng gần đây tôi cũng chạy vào bức tường này và đây là những gì tôi nghĩ ra.

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

Nếu bạn đang sử dụng foonhư một dấu phân cách, thì hãy nhìn vàoexplode()


Yup chúng ta có thể nhận được kết quả cần thiết bằng cách sử dụng chỉ số thứ nhất của mảng đã nổ. (không phải số không).
đội trưởng_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 '';
  }
?>

Thí dụ:

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

Điều này sẽ trả lại "chàng trai ở giữa".


3

Nếu bạn có nhiều lần lặp lại từ một chuỗi và bạn có mẫu [start] và [\ end] khác nhau. Đây là một chức năng mà đầu ra một mảng.

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

Đây là một chức năng

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

Sử dụng nó như

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

echo $substring;

Đầu ra (lưu ý rằng nó trả về khoảng trắng ở phía trước và tại và của chuỗi của bạn nếu tồn tại)

Tôi muốn có một chiếc bánh

Nếu bạn muốn cắt kết quả, hãy sử dụng chức năng như

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

Kết quả : Hàm này sẽ trả về false nếu $boundstringkhông được tìm thấy trong $stringhoặc nếu $boundstringchỉ tồn tại một lần trong $string, nếu không, nó sẽ trả về chuỗi con giữa lần xuất hiện đầu tiên và lần xuất hiện cuối cùng của $boundstringin $string.


Người giới thiệu


bạn đang sử dụng mệnh đề if không có dấu ngoặc, nhưng có lẽ bạn biết đó là một ý tưởng tồi?
xmoex

@xmoex, IFbạn đang nói về mệnh đề gì? có thể tôi đã mắc một số lỗi đánh máy nhưng thành thật mà nói, tôi không thể thấy bất cứ điều gì kỳ lạ ngay bây giờ. Cả hai IFtôi đã sử dụng trong chức năng trên đều có dấu ngoặc phù hợp với điều kiện. Đầu tiên IFcũng có dấu ngoặc nhọn (dấu ngoặc nhọn) bao quanh khối 2 dòng, thứ 2 IFkhông cần chúng vì đó là mã dòng đơn. Tôi đang thiếu gì?
Wh1T3h4Ck5

Tôi đang nói về dòng duy nhất. Tôi nghĩ rằng biên tập viên của bài viết của bạn đã xóa nó nhưng sau đó tôi thấy nó không ở đó ngay từ đầu. imvho đây là một nguồn phổ biến đôi khi khó tìm thấy lỗi nếu bạn thay đổi mã trong tương lai.
xmoex

@xmoex Rất không đồng ý. Sau gần 20 năm trong kinh doanh, tôi có thể nói rằng niềng răng là nguyên nhân cực kỳ hiếm gặp của lỗi (dù sao cũng cần phải có sự chú ý thích hợp). Bao quanh một dòng với dấu ngoặc nhọn là xấu xí (vấn đề quan điểm) và làm cho mã lớn hơn (vấn đề thực tế). Trong hầu hết các công ty loại bỏ niềng răng không cần thiết là hoàn thành mã. Đúng, có thể khó phát hiện trong quá trình gỡ lỗi cho người dùng thiếu kinh nghiệm nhưng đó không phải là vấn đề toàn cầu, chỉ là một bước trên con đường học tập của họ. Cá nhân tôi, không bao giờ có vấn đề lớn với niềng răng, ngay cả trong trường hợp làm tổ phức tạp.
Wh1T3h4Ck5

@ Wh1T3h4Ck5 Tôi tôn trọng ý kiến ​​của bạn và kinh nghiệm của bạn, nhưng tôi không bị thuyết phục chút nào. Niềng răng không làm cho mã lớn hơn từ quan điểm hệ thống. Nó mở rộng kích thước tập tin, nhưng trình biên dịch quan tâm điều gì? Và nếu sử dụng js, bạn có thể sẽ tự động mã xấu xí trước khi đi vào hoạt động. Tôi nghĩ rằng việc sử dụng niềng răng luôn làm tổn thương ít hơn sau đó bỏ qua chúng "đôi khi" ...
xmoex

3

Cải thiện câu trả lời của Alejandro . Bạn có thể để trống $starthoặc các $endđối số trống và nó sẽ sử dụng bắt đầu hoặc kết thúc chuỗi.

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

Sử dụng:

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

Một mã được cải thiện một chút từ GarciaWebDev và Henry Wang. Nếu $ start hoặc $ end trống được đưa ra, hàm sẽ trả về các giá trị từ đầu hoặc đến cuối chuỗi $. Ngoài ra tùy chọn Bao gồm có sẵn, cho dù chúng tôi muốn bao gồm kết quả tìm kiếm hay không:

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

Tôi phải thêm một cái gì đó vào bài viết của Julius Tilvikas. Tôi tìm kiếm một giải pháp như thế này mà ông mô tả trong bài viết của mình. Nhưng tôi nghĩ có một sai lầm. Tôi thực sự không nhận được chuỗi giữa hai chuỗi, tôi cũng nhận được nhiều hơn với giải pháp này, bởi vì tôi phải trừ chiều dài của chuỗi bắt đầu. Khi làm điều này, tôi thực sự nhận được Chuỗi giữa hai chuỗi.

Dưới đây là những thay đổi của tôi về giải pháp của anh ấy:

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

Chào hỏi

V


1

Hãy thử điều này, nó hoạt động với tôi, nhận dữ liệu giữa các từ kiểm tra .

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

1

Theo strposkiểu của PHP, nó sẽ trả về falsenếu không tìm thấy dấu bắt đầu smhoặc dấu kết thúc em.

Kết quả này ( false) khác với một chuỗi trống là những gì bạn nhận được nếu không có gì giữa dấu bắt đầu và dấu kết thúc.

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

Hàm sẽ chỉ trả về kết quả khớp đầu tiên.

Rõ ràng nhưng đáng nói là chức năng đầu tiên sẽ tìm kiếm smvà sau đó cho em.

Điều này ngụ ý bạn có thể không nhận được kết quả / hành vi mong muốn nếu emphải tìm kiếm trước và sau đó chuỗi phải được phân tích cú pháp ngược để tìm kiếm sm.


1

Đây là chức năng tôi đang sử dụng cho việc này. Tôi đã kết hợp hai câu trả lời trong một hàm cho một hoặc nhiều dấu phân cách.

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

Để sử dụng đơn giản (trả về hai):

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

Để nhận từng hàng trong một bảng để mảng kết quả:

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

1

tôi sử dụng

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

Subtitue <TAG> cho bất kỳ dấu phân cách nào bạn muốn.


1

một phiên bản chỉnh sửa của những gì Alejandro García Iglesias đặt.

Điều này cho phép bạn chọn một vị trí cụ thể của chuỗi bạn muốn nhận dựa trên số lần kết quả được tìm thấy.

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

sử dụng:

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

strpose có một đầu vào tùy chọn bổ sung để bắt đầu tìm kiếm tại một điểm cụ thể. vì vậy tôi lưu trữ vị trí trước đó trong $ cPos để khi vòng lặp for kiểm tra lại, nó sẽ bắt đầu ở cuối nơi nó rời đi.


1

Phần lớn câu trả lời ở đây không trả lời phần đã chỉnh sửa, tôi đoán chúng đã được thêm vào trước đó. Nó có thể được thực hiện với regex, như một câu trả lời đề cập. Tôi đã có một cách tiếp cận khác.


Hàm này tìm kiếm chuỗi $ và tìm chuỗi đầu tiên giữa chuỗi $ start và $ end, bắt đầu từ vị trí $ offset. Sau đó, nó cập nhật vị trí $ offset để chỉ đến điểm bắt đầu của kết quả. Nếu $ includeD Friiter là đúng, nó bao gồm các dấu phân cách trong kết quả.

Nếu không tìm thấy chuỗi $ start hoặc $ end, nó sẽ trả về null. Nó cũng trả về null nếu $ string, $ start hoặc $ end là một chuỗi rỗng.

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

Hàm sau tìm thấy tất cả các chuỗi nằm giữa hai chuỗi (không trùng lặp). Nó đòi hỏi hàm trước và các đối số là như nhau. Sau khi thực hiện, $ offset trỏ đến đầu chuỗi kết quả tìm thấy cuối cùng.

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

Ví dụ:

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

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

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

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


0

Sử dụng:

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

Tôi đã gặp một số vấn đề với hàm get_opes_b Among (), được sử dụng ở đây. Vì vậy, tôi đã đến với phiên bản của riêng tôi. Có lẽ nó có thể giúp những người trong trường hợp tương tự như của tôi.

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

đã viết những lúc này trở lại, thấy nó rất hữu ích cho một loạt các ứng dụng.

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

Với một số lỗi bắt. Cụ thể, hầu hết các hàm được trình bày yêu cầu $ end tồn tại, trong khi thực tế trong trường hợp của tôi, tôi cần nó là tùy chọn. Sử dụng đây là $ end là tùy chọn và đánh giá cho FALSE nếu $ start hoàn toàn không tồn tại:

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

Phiên bản UTF-8 của câu trả lời @Alejandro Iglesias, sẽ hoạt động cho các ký tự không phải là tiếng 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)

0

Có giải pháp tốt nhất cho việc này từ tonyspiro

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

0

Nó có thể được thực hiện dễ dàng bằng cách sử dụng chức năng nhỏ này:

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

Tôi đã sử dụng điều này trong nhiều năm và nó hoạt động tốt. Có lẽ có thể được thực hiện hiệu quả hơn, nhưng

chuỗi ký tự ("Chuỗi kiểm tra", "", "", 0) trả về chuỗi Chuỗi kiểm tra
("Chuỗi kiểm tra", "Kiểm tra", "", 0) trả về chuỗi
lấy chuỗi ("Chuỗi kiểm tra", "s", "", 5) trả về chuỗi

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

}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.