PHPで2つの文字列の間の部分文字列を取得するには?



13 Answers

正規表現を使用してください:

$str = 'before-str-after';
if (preg_match('/before-(.*?)-after/', $str, $match) == 1) {
    echo $match[1];
}

onlinePhp

Question

私は2つの単語(または2つの文字)の間の部分文字列を返す関数が必要です。 私はそれを達成するPHP関数があるかどうか疑問に思っています。 私は正規表現について考えたくありません(私は1つしかできませんが、実際にはそれが最善の方法だとは思わない)。 strpos関数とsubstr関数を考える。 ここに例があります:

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

次の関数を呼び出します。 $substring = getInnerSubstring($string,"foo");
それは「私はケーキがほしい」と返す。

前もって感謝します。

更新:まあ、今までは、ちょうど1つの文字列で2つの単語の部分文字列を得ることができます。少し離れて、 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"}配列を得る。




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"



私はJulius Tilvikasの投稿に何かを加えなければなりません。 彼は彼の記事で説明したような解決策を探しました。 しかし、私は間違いがあると思う。 私は実際には2つの文字列の間の文字列を取得しない、私はまた、このソリューションでより多くを得る、私は開始文字列の長さを引く必要があるため。 これを行うと、私は本当に2つの文字列の間のStringを取得します。

彼のソリューションの変更点は次のとおりです。

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




区切り記号としてfooを使用している場合は、 explode()見てください。




つかいます:

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

?>



PHPのstrposスタイルでは、開始マークsmまたは終了マークemが見つからない場合はfalseを返しfalse

この結果( false )は、開始マークと終了マークの間に何もない場合に得られるものである空の文字列とは異なります。

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探します。

これは、 emを最初に検索しなければならない場合、そして文字列をsmを検索して後方に解析しなければならない場合、望ましい結果/動作を得られない可能性があることを意味します。




'/ s'

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

これを試して ;)




これは私がこれに使用している関数です。 私は1つまたは複数の区切り文字に対して1つの関数で2つの答えを結合しました。

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

単純な使用のために(2を返します):

$result = getStringBetweenDelimiters(" one two three ", 'one', 'three');

テーブル内の各行を結果配列にするには:

$result = getStringBetweenDelimiters($table, '<tr>', '</tr>', true);



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

これは "中間の男"を返します。




いくつかのエラーをキャッチします。 具体的には、提示された関数のほとんどは$ 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;
    }

}



1つの文字列から複数の繰り返しがあり、[開始]と[終了]のパターンが異なる場合。 以下は、配列を出力する関数です。

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



私はこれを何年も使っており、うまくいきます。 おそらくより効率的になるだろうが、

grabstring( "テスト文字列"、 ""、 ""、0)はテスト文字列を返します
grabstring( "Test string"、 "Test"、 ""、0)は文字列を返します
grabstring( "テスト文字列"、 "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);
}

}




私が使う

if (count(explode("<TAG>", $input))>1){
      $content = explode("</TAG>",explode("<TAG>", $input)[1])[0];
}else{
      $content = "";
}

任意のデリミタの字幕<TAG>。




私はここで使用される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;
}



Related