如何获得PHP中的两个string之间的子string?

我需要一个函数返回两个单词(或两个字符)之间的子string。 我想知道是否有一个PHPfunction,实现了。 我不想考虑正则expression式(好吧,我可以做一个,但真的不认为这是最好的方法)。 对strpossubstr函数的思考。 这是一个例子:

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

我们调用这个函数: $substring = getInnerSubstring($string,"foo");
它返回:“我想要一个蛋糕”。

提前致谢。

更新:到目前为止,我只需要一个string就可以得到一个子string两个单词,你允许我走得更远,并询问是否可以扩展使用getInnerSubstring($str,$delim)来获取任何string之间的分界值,例如:

 $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"}的数组。

如果string不同(即:[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) 

正则expression式是要走的路:

 $str = 'before-str-after'; preg_match('/before-(.*?)-after/', $str, $match); echo $match[1]; 
 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); } 

样品使用:

 echo GetBetween("a","c","abc"); // returns: b echo GetBetween("h","o","hello"); // returns: ell 
 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" 
 function getInbetweenStrings($start, $end, $str){ $matches = array(); $regex = "/$start([a-zA-Z0-9_]*)$end/"; preg_match_all($regex, $str, $matches); return $matches[1]; } 

举例来说,你需要@@之间的string(键)数组,在下面的例子中,'/'不在中间

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

如果你使用foo作为分隔符,那么看看explode()

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

这将返回“中间人”。

如果从一个string中有多个重复,并且有不同的[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; } 

使用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"

我喜欢正则expression式的解决scheme,但没有其他人适合我。

如果你知道只有1个结果,你可以使用以下内容:

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

将BEFORE和AFTER更改为所需的分隔符。

另外请记住,这个函数将返回整个string,如果没有匹配。

这个解决scheme是多行的,但你可以根据你的需要使用修饰符。

这是一个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; } 

像使用它

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

输出(注意,如果存在的话,它会返回前面的空格和string的空格)

我想要一个蛋糕

如果你想修剪结果使用function

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

结果 :如果在$string没有find$boundstring ,或者在$string只存在$boundstring一次,那么这个函数将返回false ,否则返回在$string$boundstring第一次和最后一次出现之间的子$string


参考

  • strpos()
  • strrpos()
  • SUBSTR()
  • 修剪()

使用:

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

GarciaWebDev和Henry Wang有一些改进的代码。 如果给出空$ start或$ end,则函数将返回$ string的开头或结尾的值。 也包含选项可用,无论我们是否要包含search结果:

 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的职位。 我寻找像他在post里描述的那样的解决scheme。 但我认为有一个错误。 我不明白两个string之间的string,我也得到更多的这个解决scheme,因为我必须减去起始string的长度。 当这样做,我真的得到两个string之间的string。

这是我对他的解决scheme的改变:

 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

在PHP的strpos风格中,如果没有find开始标记sm或结束标记em它将返回false

这个结果( false空string是不同的 ,如果开始和结束标记之间没有任何内容,那么就是你得到的结果。

 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

这意味着如果必须首先searchem那么可能无法获得所需的结果/行为,然后必须向后parsingstring以searchsm

使用:

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

我在这里使用的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; } 

这些时间写回来,发现它对于广泛的应用非常有用。

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

试试这个,它为我工作,在testing词之间获取数据。

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

随着一些错误捕捉。 具体来说,所提出的大部分function都需要$ 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; } } 

不是一个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 ) 

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) 

这是我正在使用的function。 我在一个函数中为单个或多个分隔符组合了两个答案。

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

我一直使用这个多年,它运作良好。 可能可以提高效率,但是

grabstring(“testingstring”,“”,“”,0)返回testingstring
grabstring(“Test string”,“Test”,“”,0)返回string
grabstring(“Test string”,“s”,“”,5)返回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); } 

}

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

用法:

 echo strbtwn($s,"<h2>","</h2>");//<h2>:)</h2> --> :) 

'/ S'

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

尝试这个 ;)

 echo explode('/', explode(')', $string)[0])[1]; 

用你的结尾字符/stringreplace'/',第一个字符/string和')'。 🙂