Organizational Research By

Surprising Reserch Topic

get substring between two strings php


get substring between two strings php  using -'php,substring'

I need a function that returns the substring between two words (or two characters).
I'm wondering whether there is a php function that achieves that. I do not want to think about regex (well, I could do one but really don't think it's the best way to do that). Thinking of strpos and substr functions.
Here's an example:

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


We call the function: $substring = getInnerSubstring($string,"foo");
It returns: " I wanna a cake ".

Thanks in advance.

Update:
Well, till now, I can just get a substring beteen two words in just one string, do you permit to let me go a bit far and ask if I can extend the use of getInnerSubstring($str,$delim) to get any strings that are between delim value, example:

$string =" foo I like php foo, no foo I like asp foo, foo go to hell foo";


Maybe I get an array like {"I like php", "I like asp", "go to hell"}.
    

asked Sep 21, 2015 by ankitarajoria4
0 votes
19 views



Related Hot Questions

17 Answers

0 votes

If the strings are different (ie: [foo] & [/foo]), take a look at this post from Justin Cook. I copy his code below:

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)
answered Sep 21, 2015 by akasati02
0 votes
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] : '';
}

Example of use:

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

If you want to remove surrounding whitespace, use trim. Example:

var_dump(trim(getInnerSubstring('foo Hello world foo','foo')));
// prints: string(11) "Hello world"
answered Sep 21, 2015 by gauravsinghal83
0 votes

http://csnippet.com/s.php?id=31

function GetBetween($var1="",$var2="",$pool){
$temp1 = strpos($pool,$var1)+strlen($var1);
$result = substr($pool,$temp1,strlen($pool));
$dd=strpos($result,$var2);
if($dd == 0){
$dd = strlen($result);
}

return substr($result,0,$dd);
}

Sample use:

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

echo GetBetween("h","o","hello"); // returns: ell
answered Sep 21, 2015 by shegokar.anjeet
0 votes

Here's a function

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

Use it like

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

echo $substring;

Output (note that it returns spaces in front and at the and of your string if exist)

I wanna a cake

If you want to trim result use function like

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

Result: This function will return false if $boundstring was not found in $string or if $boundstring exists only once in $string, otherwise it returns substring between first and last occurrence of $boundstring in $string.


References
answered Sep 21, 2015 by badhwar.rohit
0 votes
function getInbetweenStrings($start, $end, $str){
    $matches = array();
    $regex = "/$start([a-zA-Z0-9_]*)$end/";
    preg_match_all($regex, $str, $matches);
    return $matches[1];
}

for examle you want the array of strings(keys) between @@ in following example, where '/' doesn't fall in-between

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

print_r($str_arr);
answered Sep 21, 2015 by kotmus2002
0 votes

Use:


answered Sep 21, 2015 by sameer rathore
0 votes

Use:

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');
answered Sep 21, 2015 by amit.gupta
0 votes

A bit improved code from GarciaWebDev and Henry Wang. If empty $start or $end is given, function returns values from the beginning or to the end of the $string. Also Inclusive option is available, whether we want to include search result or not:

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);
}
answered Sep 21, 2015 by maurya
0 votes


Example: 

This will return "the guy in the middle".
answered Sep 21, 2015 by yogeshplv
0 votes

I have to add something to the post of Julius Tilvikas. I looked for a solution like this one he described in his post. But i think there is a mistake. I don't get realy the string between two string, i also get more with this solution, because i have to substract the lenght of the start-string. When do this, i realy get the String between two strings.

Here are my changes of his solution:

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

answered Sep 21, 2015 by gauravg.gwl
0 votes

I have been using this for years and it works well. Could probably be made more efficient, but

grabstring("Test string","","",0) returns Test string
grabstring("Test string","Test ","",0) returns string
grabstring("Test string","s","",5) returns 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);
}

}

answered Sep 21, 2015 by ankitarajoria4
0 votes
function strbtwn($s,$start,$end){
    $i = strpos($s,$start);
    $j = strpos($s,$end,$i);
    return $i===false||$j===false? false: substr(substr($s,$i,$j-$i),strlen($start));
}

usage:

echo strbtwn($s,"

","

");//

:)

--> :)
answered Sep 21, 2015 by amit_cmps
0 votes

If you have multiple recurrences from a single string and you have different [start] and [\end] pattern. Here's a function which output an 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;
}
answered Sep 21, 2015 by okesh.badhiye
0 votes

I had some problems with the get_string_between() function, used here. So I came with my own version. Maybe it could help people in the same case as mine.

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;
}
answered Sep 21, 2015 by badhwar.rohit
0 votes

wrote these some time back, found it very useful for a wide range of applications.

 $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);
}
?>
answered Sep 21, 2015 by atulpariharmca
0 votes

'/s'

function getStrBetween($left, $right, $in)
{
    preg_match('/'.$left.'(.*?)'.$right.'/s', $in, $match);
    return empty($match[1]) ? NULL : $match[1];
}

try this ;)

answered Sep 21, 2015 by 20shahi
0 votes

I like the regular expression solutions but none of the others suit me.

If you know there is only gonna be 1 result you can use the following:

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

Change BEFORE and AFTER to the desired delimiters.

Also keep in mind this function will return the whole string in case nothing matched.

This solution is multiline but you can play with the modifiers depending on your needs.

answered Sep 21, 2015 by bhavin

...