【问题标题】:How to get a substring between two strings in PHP?如何在 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"} 的数组。

【问题讨论】:

标签: php substring


【解决方案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];
            

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

            【讨论】:

              猜你喜欢
              • 2013-09-12
              • 1970-01-01
              • 2013-01-31
              • 2019-12-02
              • 1970-01-01
              • 1970-01-01
              • 2015-06-24
              相关资源
              最近更新 更多