Як отримати підрядок між двома рядками в 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> функція string_bet between ($ string, $ start, $ end, $ inclusive = false) {$ string = "". $ string; $ ini = strpos ($ string, $ start); якщо ($ ini == 0) повернути ""; if (! $ включно) $ ini + = strlen ($ start); $ len = strpos ($ string, $ end, $ ini) - $ ini; if ($ включно) $ len + = strlen ($ end); return substr ($ string, $ ini, $ len); } </code>
Генрі

2
Чи можливо розширити цю функцію, щоб вона могла повернути два рядки? Скажімо, у мене є $ fullstring "[тег] собак [/ тег] та [тег] кішок [/ тег]", і я хочу масив назад, який містить "собак" та "котів".
Леонард Шует

1
@LeonardSchuetz - Спробуйте відповісти тоді.
leymannx

"[тег] собак [/ тег] та [тег] котів [/ тег]" досі не відповіли. Як отримати «собак» та «котів» у вигляді масиву? Будь ласка, порадь.
Ромнік Суза

1
Хтось відповів на моє запитання! Ви можете відвідати цей stackoverflow.com/questions/35168463 / ...
Romnick Susa

79

Регулярні вирази - це шлях:

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

онлайнPhp


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
До речі, ваш пункт "Зразкове використання" неправильний. Аргументи в абсолютно неправильному порядку.
той-бен

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
Це акуратно, оскільки це однолінійний, але, на жаль, обмежується наявністю унікального роздільника, тобто якщо вам потрібна підрядка між "foo" і "bar", вам доведеться використовувати іншу стратегію.
мастазі

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
Не забувайте бігти "/" типу "\ /", коли це $ start або $ end змінна.
Luboš Remplík

10

два рази використовувати функцію strstr 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 pro. але я нещодавно наткнувся на цю стіну, і це те, що я придумав.

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-й індекс вибухнулого масиву. (не нульовий).
капітан_а

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

Якщо у вас є кілька повторень з однієї рядка, і ви маєте різний шаблон [start] та [\ end]. Ось функція, яка виводить масив.

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.


Список літератури


ви використовуєте клавішу if без дужок, але ви, мабуть, знаєте, що це погана ідея?
xmoex

@xmoex, про який IFпункт ти йдеш ? можливо я зробив якусь помилку, але якщо чесно, я нічого дивного зараз не бачу. Обидва IFя, які я використовував у функції вище, мають належні дужки навколишнього стану. Спочатку IFтакож є фігурні дужки (дужки), які оточують блок 2 рядків, другий IFне потребує їх, оскільки це єдиний код рядка. Що мені не вистачає?
Wh1T3h4Ck5

Я говорю про єдиний рядок. Я думав, що редактор вашої публікації видалив її, але тоді я побачив, що її там немає в першу чергу. imvho - це поширене джерело помилок, які часом важко знайти, якщо змінити код у майбутньому.
xmoex

@xmoex Дуже не погоджуюся. Після майже 20 років роботи я можу сказати, що брекети є надзвичайно рідкісною причиною помилок (все-таки потрібний правильний відступ). Оточення однієї лінії з дужками некрасиво (питання про думку) і збільшує код (фактично). У більшості компаній видалення зайвих брекетів потрібно при заповненні коду. Правда, це може бути важко помітити під час налагодження для недосвідчених користувачів, але це не глобальна проблема, а лише крок на їхньому навчальному шляху. У мене особисто ніколи не було великих проблем з брекетами, навіть у випадку складного гніздування.
Wh1T3h4Ck5

@ 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

Трохи вдосконалений код від GarciaWebDev та Henry Wang. Якщо задано порожній $ start або $ end, функція повертає значення з початку або до кінця $ string. Також доступна опція інклюзії, хочемо ми включити результат пошуку чи ні:

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

V


1

Спробуйте це, Його робота для мене, отримайте дані між тестовим словом.

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

1

У strposстилі PHP це повернеться, 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, тому коли цикл for знову перевіряється, він починається в кінці, де він припинився.


1

Переважна більшість відповідей тут не відповідає редагованій частині, я думаю, вони були додані раніше. Це можна зробити за допомогою регулярного вираження, як згадується одна відповідь. У мене був інший підхід.


Ця функція шукає $ string і знаходить першу рядок між ними $ start та $ end, починаючи з позиції $ offset. Потім він оновлює позицію $ offset, щоб вказати на початок результату. Якщо $ includeDelimiters вірно, це включає в себе роздільники.

Якщо рядок $ start або $ end не знайдено, вона повертається в нульове значення. Він також повертає null, якщо $ string, $ start або $ end - порожній рядок.

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

Наступна функція знаходить усі рядки, що знаходяться між двома рядками (без перекриттів). Для цього потрібна попередня функція, і аргументи однакові. Після виконання $ offset вказує на початок останнього знайденого рядка результатів.

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

З деякою помилкою підхоплення. Зокрема, більшість представлених функцій вимагають існування $ end, коли насправді в моєму випадку мені потрібно було, щоб воно було необов’язковим. Використовувати це $ end не є обов'язковим, і оцініть для FALSE, якщо $ start взагалі не існує:

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 ("Test string", "", "", 0) повертає Test string
grabstring ("Test string", "Test", "", 0) повертає
stringstring string ("Test string", "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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.