PHP에서 두 문자열 사이에 부분 문자열을 얻는 방법은 무엇입니까?


142

두 단어 (또는 두 문자) 사이의 하위 문자열을 반환하는 함수가 필요합니다. 그것을 달성하는 PHP 함수가 있는지 궁금합니다. 정규식에 대해 생각하고 싶지 않습니다 (글쎄, 나는 할 수는 있지만 실제로 가장 좋은 방법이라고 생각하지는 않습니다). 사고 strpossubstr기능. 예를 들면 다음과 같습니다.

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

답변:


324

문자열이 다른 경우 (예 : [foo] & [/ foo]) Justin Cook 의이 게시물 을 살펴보십시오 . 아래 코드를 복사합니다.

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_between ($ string, $ start, $ end, $ inclusive = false) {$ string = "".. $ string; $ ini = strpos ($ string, $ start); ($ ini == 0)이면 ""를 반환합니다. if (! $ 포함) $ ini + = strlen ($ start); $ len = strpos ($ string, $ end, $ ini)-$ ini; ($ 포함) $ len + = strlen ($ end); substr ($ string, $ ini, $ len)을 반환; } </ code>
Henry

2
이 함수를 확장하여 두 개의 문자열을 줄 수 있습니까? "[tag] dogs [/ tag] 및 [tag] cats [/ tag]"의 $ fullstring이 있고 "dogs"및 "cats"를 포함하는 배열을 원한다고 가정하겠습니다.
Leonard Schuetz

1
@LeonardSchuetz – 이 답변 을 시도하십시오 .
leymannx

"[tag] 개 [/ tag] 및 [tag] cats [/ tag]"는 여전히 응답하지 않습니다. "개"와 "고양이"를 배열 형태로 얻는 방법? 조언을 부탁드립니다.
Romnick Susa

1
누군가 내 질문에 대답했습니다! 이 stackoverflow.com/questions/35168463/…를
Romnick Susa


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, "샘플 사용"단락이 잘못되었습니다. 인수는 완전히 잘못된 순서입니다.
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] : '';
}

사용 예 :

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"사이의 하위 문자열이 필요한 경우 다른 전략을 사용해야합니다.
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];
}

예를 들어 다음 예제에서 @@ 사이에 문자열 (키) 배열을 원합니다. 여기서 '/'는 중간에 없습니다.

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

BEFORE 및 AFTER를 원하는 분리 문자로 변경하십시오.

또한이 함수는 일치하지 않는 경우 전체 문자열을 반환합니다.

이 솔루션은 여러 줄로 구성되어 있지만 필요에 따라 수정자를 사용할 수 있습니다.


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()


그렇습니다. 첫 번째 분해 배열 인덱스를 사용하여 필요한 결과를 얻을 수 있습니다. (0이 아님).
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

단일 문자열에서 여러 번 반복해서 [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-clause를 사용하고 있지만 아마도 그것이 나쁜 생각이라는 것을 알고 있습니까?
xmoex

@xmoex, 무슨 IF말을하니? 어쩌면 나는 오타를 만들었지 만 솔직히 말해서 지금 이상한 것을 볼 수 없습니다. IF위의 기능에서 사용한 두 가지 모두 상태를 둘러싼 적절한 괄호가 있습니다. 먼저 IF2 줄 블록을 둘러싸는 중괄호 (중괄호)가 있으며 두 번째 IF줄은 단일 줄 코드이기 때문에 필요하지 않습니다. 내가 뭘 놓친거야?
Wh1T3h4Ck5

나는 한 줄에 대해 이야기하고 있습니다. 게시물 편집자가 삭제 한 것으로 생각했지만 처음에는 해당 게시물이없는 것을 보았습니다. imvho 이것은 나중에 코드를 변경하면 버그를 찾기 어려운 일반적인 소스입니다.
xmoex

@xmoex 매우 동의하지 않습니다. 사업에서 거의 20 년이 지난 후 나는 중괄호가 극히 드문 버그의 원인이라고 말할 수 있습니다 (어쨌든 적절한 들여 쓰기가 필요합니다). 중괄호로 둘러싼 한 줄은 못 생기고 (설명의 문제) 코드를 더 크게 만듭니다 (사실의 문제). 대부분의 회사에서는 코드 완성시 불필요한 괄호를 제거해야합니다. 사실, 경험이 부족한 사용자를 위해 디버깅하는 동안 파악하기가 어려울 수 있지만 이는 글로벌 문제가 아니며 학습 과정의 한 걸음입니다. 개인적으로 복잡한 중첩의 경우에도 중괄호에 큰 문제가 없었습니다.
Wh1T3h4Ck5

@ Wh1T3h4Ck5 나는 당신의 의견과 경험을 존중하지만, 전혀 확신하지 않습니다. 중괄호는 시스템 관점에서 코드를 더 크게 만들지 않습니다. 파일 크기가 커지지 만 컴파일러는 무엇을 신경 쓰나요? 그리고 js를 사용하면 라이브로 가기 전에 코드를 자동으로 추한 것입니다. 나는 중괄호를 사용하면 항상 "때때로"를 생략하고 덜
아프다고 생각합니다

3

Alejandro의 답변 개선 . $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

Julius Tilvikas의 게시물에 무언가를 추가해야합니다. 나는 그가 그의 게시물에서 설명 한 것과 같은 해결책을 찾았습니다. 그러나 나는 실수가 있다고 생각합니다. 두 문자열 사이의 문자열을 실제로 얻지 못합니다. 시작 문자열의 길이를 빼야하기 때문에이 솔루션으로 더 많은 것을 얻습니다. 이 작업을 수행 할 때 두 문자열 사이에서 문자열을 얻습니다.

그의 솔루션 변경 사항은 다음과 같습니다.

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

그 레츠

V


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

간단한 사용을 위해 (2를 반환) :

$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

Alejandro García Iglesias가 편집 한 버전.

결과를 찾은 횟수에 따라 원하는 문자열의 특정 위치를 선택할 수 있습니다.

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 에는 특정 지점에서 검색을 시작하기위한 추가 옵션 입력이 있습니다. for 루프 검사가 다시 시작되면 중단 된 위치의 끝에서 시작하므로 $ cPos에 이전 위치를 저장합니다.


1

여기에있는 대부분의 답변은 편집 된 부분에 대한 답변이 아닙니다. 하나의 답변에서 언급했듯이 정규 표현식으로 수행 할 수 있습니다. 나는 다른 접근법을 가지고있었습니다.


이 함수는 $ string을 검색 하여 $ offset 위치에서 시작하여 $ start와 $ end 문자열 사이첫 번째 문자열을 찾습니다 . 그런 다음 $ offset 위치를 업데이트하여 결과의 ​​시작을 가리 킵니다. $ includeDelimiters가 true이면 결과에 구분자가 포함됩니다.

$ start 또는 $ end 문자열이 없으면 null을 반환합니다. $ string, $ start 또는 $ end가 빈 문자열이면 null도 반환합니다.

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는 선택 사항이며 $ start가 전혀 없으면 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

@Alejandro Iglesias의 UTF-8 버전은 라틴이 아닌 문자에 사용할 수 있습니다.

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)은 테스트 문자열을 반환합니다.
grabstring ( "Test string", "Test", "", 0)은 문자열을 반환합니다.
grabstring ( "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);
}

}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.