可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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 go). 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 farther 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, but foo I also like asp foo, foo I feel hero foo\";
I get an array like {\"I like php\", \"I also like asp\", \"I feel hero\"}
.
回答1:
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)
回答2:
Regular expressions is the way to go:
$str = \'before-str-after\';
if (preg_match(\'/before-(.*?)-after/\', $str, $match) == 1) {
echo $match[1];
}
onlinePhp
回答3:
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 \'\';
}
}
Sample use:
echo getBetween(\"a\",\"c\",\"abc\"); // returns: \'b\'
echo getBetween(\"h\",\"o\",\"hello\"); // returns: \'ell\'
echo getBetween(\"a\",\"r\",\"World\"); // returns: \'\'
回答4:
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\"
回答5:
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);
回答6:
If you\'re using foo
as a delimiter, then look at explode()
回答7:
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.
回答8:
<?php
function getBetween($content,$start,$end){
$r = explode($start, $content);
if (isset($r[1])){
$r = explode($end, $r[1]);
return $r[0];
}
return \'\';
}
?>
Example:
<?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;
?>
This will return \"the guy in the middle\".
回答9:
use strstr php function twice.
$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;
outputs:
\"is a great day to\"
回答10:
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;
}
回答11:
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
- strpos()
- strrpos()
- substr()
- trim()
回答12:
Use:
<?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));
}
?>
回答13:
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);
}
回答14:
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
回答15:
Try this, Its work for me, get data between test word.
$str = \"Xdata test HD01 test 1data\";
$result = explode(\'test\',$str);
print_r($result);
echo $result[1];
回答16:
In PHP\'s strpos
style this will return false
if the start mark sm
or the end mark em
are not found.
This result (false
) is different from an empty string that is what you get if there is nothing between the start and end marks.
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 );
}
The function will return only the first match.
It\'s obvious but worth mentioning that the function will first look for sm
and then for em
.
This implies you may not get the desired result/behaviour if em
has to be searched first and then the string have to be parsed backward in search of sm
.
回答17:
Not a php pro. but i recently ran into this wall too and this is what i came up with.
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
)
回答18:
This is the function I\'m using for this. I combined two answers in one function for single or multiple delimiters.
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
For simple use (returns two):
$result = getStringBetweenDelimiters(\" one two three \", \'one\', \'three\');
For getting each row in a table to result array :
$result = getStringBetweenDelimiters($table, \'<tr>\', \'</tr>\', true);
回答19:
I use
if (count(explode(\"<TAG>\", $input))>1){
$content = explode(\"</TAG>\",explode(\"<TAG>\", $input)[1])[0];
}else{
$content = \"\";
}
Subtitue <TAG> for whatever delimiter you want.
回答20:
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\');
回答21:
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;
}
回答22:
wrote these some time back, found it very useful for a wide range of applications.
<?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);
}
?>
回答23:
With some error catching. Specifically, most of the functions presented require $end to exist, when in fact in my case I needed it to be optional. Use this is $end is optional, and evaluate for FALSE if $start doesn\'t exist at all:
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;
}
}
回答24:
UTF-8 version of @Alejandro Iglesias answer, will work for non-latin characters:
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)
回答25:
Got best solution for this from tonyspiro
function getBetween($content,$start,$end){
$r = explode($start, $content);
if (isset($r[1])){
$r = explode($end, $r[1]);
return $r[0];
}
return \'\';
}
回答26:
Improvement of Alejandro\'s answer. You can leave the $start
or $end
arguments empty and it will use the start or end of the string.
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);
}
}
回答27:
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);
}
}
回答28:
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,\"<h2>\",\"</h2>\");//<h2>:)</h2> --> :)
回答29:
\'/s\'
function getStrBetween($left, $right, $in)
{
preg_match(\'/\'.$left.\'(.*?)\'.$right.\'/s\', $in, $match);
return empty($match[1]) ? NULL : $match[1];
}
try this ;)
回答30:
echo explode(\'/\', explode(\')\', $string)[0])[1];
Replace \'/\', with your first character/string and \')\' with your ending character/string. :)