如何在 PHP 中获取两个字符串之间的子字符串?

Posted

技术标签:

【中文标题】如何在 PHP 中获取两个字符串之间的子字符串?【英文标题】:How to get a substring between two strings in PHP? 【发布时间】:2011-08-07 11:21:49 【问题描述】:

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

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

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


更新: 好吧,到现在为止,我只能在一个字符串中获取两个单词之间的子字符串,你允许让我走得更远一点,问我是否可以扩展 getInnerSubstring($str,$delim) 的使用以获取任何介于 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" 的数组。

【问题讨论】:

如果你已经在使用 Laravel,\Illuminate\Support\Str::between('This is my name', 'This', 'name'); 很方便。 laravel.com/docs/7.x/helpers#method-str-between 【参考方案1】:

考虑这个函数。它接受位置编号和字符串参数:

function get_string_between($string, $start = '', $end = '')
    if (empty($start)) 
      $start = 0;
    elseif (!is_numeric($start)) 
      $start = strpos($string, $start) + strlen($start);
    

    if (empty($end)) 
      $end = strlen($string);
    elseif (!is_numeric($end)) 
      $end = strpos($string, $end);
    

    return substr($string, $start, ($end - $start));
  

结果:

echo get_string_between($string); // result = this is my [tag]dog[/tag]
echo get_string_between($string, 0); // result = this is my [tag]dog[/tag]
echo get_string_between($string, ''); // result = this is my [tag]dog[/tag]
echo get_string_between($string, '[tag]'); // result = dog[/tag]
echo get_string_between($string, 0, '[/tag]'); // result = this is my [tag]dog
echo get_string_between($string, '', '[/tag]'); // result = this is my [tag]dog
echo get_string_between($string, '[tag]', '[/tag]'); // result = dog
echo get_string_between($string, '[tag]', strlen($string)); // dog[/tag]

【讨论】:

empty() 在保证已声明变量时是不恰当的调用。【参考方案2】:
function img($n,$str)

    $first=$n."tag/";
    $n+=1;
    $last=$n."tag/";
    $frm = stripos($str,$first);
    $to = stripos($str,$last);
    echo $frm."<br>";
    echo $to."<br>";
    $to=($to=="")?(strlen($str)-$frm):($to-$frm);
    $final = substr($str,$frm,$to);
    echo $to."<br>";
    echo $final."<br>";




$str = "1tag/Ilove.php2tag/youlike.java3tag/youlike.php";
img(1,$str);

img(2,$str);

img(3,$str);

【讨论】:

【参考方案3】:

获取特定文本并在 php 中推入数组:

<!DOCTYPE html>
<html>
<body>

<?php
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 = '.layout  

color:  base_color  



li  

color:  sub_color  

 

.text  

color:  txt_color 

 

 .btn  

color:  btn_color 

 

.more_text

color:more_color

';


$arr = [];

while(1)
  $parsed = get_string_between($fullstring, '', '');
  if(!$parsed)
    break;
  array_push($arr,$parsed);
  $strposition = strpos($fullstring,"");
  $nextString = substr($fullstring, $strposition+1, strlen($fullstring));
  $fullstring = $nextString;
  echo "<br>";

print_r($arr);

?>

</body>
</html>

没有数组:

<?php
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 = '.layout  

color:  base_color  



li  

color:  sub_color  

 

.text  

color:  txt_color 

 

 .btn  

color:  btn_color 

 

.more_text

color:more_color

';


while(1)
  $parsed = get_string_between($fullstring, '', '');
  if(!$parsed)
    break;
  echo $parsed;
  $strposition = strpos($fullstring,"");
  $nextString = substr($fullstring, $strposition+1, strlen($fullstring));
  $fullstring = $nextString;
  echo "<br>";


?>

对于单个输出,删除数组和循环。

<?php
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 = '.layout  

color:  base_color  



li  

color:  sub_color  

 

.text  

color:  txt_color 

 

 .btn  

color:  btn_color 

 

.more_text

color:more_color

';

  $parsed = get_string_between($fullstring, '', '');
  echo $parsed;

?>

【讨论】:

【参考方案4】:

使用 substr 的简单解决方案

$posStart = stripos($string, $start) + strlen($start);
$length = stripos($string, $end) - $posStart;

$substring = substr($string,  $posStart,  $length);

【讨论】:

【参考方案5】:

我多年来一直在使用它,并且效果很好。可能会变得更有效率,但是

grabstring("测试字符串","","",0) 返回测试字符串 grabstring("测试字符串","测试","",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);

【讨论】:

【参考方案6】:
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> --> :)

【讨论】:

【参考方案7】:
echo explode('/', explode(')', $string)[0])[1];

用你的第一个字符/字符串替换'/',用你的结束字符/字符串替换')'。 :)

【讨论】:

以上是关于如何在 PHP 中获取两个字符串之间的子字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何在一行中的多个位置替换两个字符串之间的子字符串

如何在 PHP 中找到两个字符串之间的最大公共子字符串?

PHP使用RegEx获取字符串的子字符串

匹配两个特殊字符之间的子字符串,不包括字符

使用Python中的re.search(pattern,text)在两个指定的子字符串之间提取子字符串

删除两个字符之间的子字符串(java)