1

なぜこれが機能しないのですか?

<?php

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

$str = "[id]159828[/id][name][/name]";

$str =  GetBetween("[name]","[/name]",$str);

echo $str;
?>

戻り値:

[/name]

そこに何かがあればうまくいきます。見つからない場合は何も返さない必要があります。

ありがとう!

4

4 に答える 4

1

まではすべて正常に動作し$resultます。あなたが持っている:

$result = substr($pool,$temp1,strlen($pool));

$temp1 = 15、およびがstrlen($pool) = 22あるので、これは次と同等です。

$result = substr("[id]159828[/id][name][/name]", 15, 22)

$lengthここで引数を省略して、substr位置 15 以降の文字列の残りを返すだけに$resultすることもできます"[/name]"

これは、 inが最初にあるため、が$dd0 になることを意味します。その後、ステートメントは に変わります。これは 7 です。次に、戻り値は、 またはであり、これは に評価されます。strpos"[/name]"$resultif()$ddstrlen($result)substr($result,0,$dd)$substr("[/name]",0,7)"[/name]"

これを修正するには、ステートメントを完全に削除する必要があります。if()

そう$ddすれば、 はゼロのままになるため、return値は長さがゼロの部分文字列になります。これは、目的の空文字列です。

于 2013-08-03T01:35:43.633 に答える
1

このチェックを追加するだけです:

if(substr($pool, strpos($pool, $var1), strlen("$var1$var2")) == "$var1$var2")
return false;

それで:

function GetBetween($var1="",$var2="",$pool) {
    if(substr($pool, strpos($pool, $var1), strlen("$var1$var2")) === "$var1$var2"){
      return false;
    }
    $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);
}
于 2013-08-03T01:43:06.590 に答える
1

正規表現を使用して、2 つの値の間のものを一致させることができます。例えば

function between($v1, $v2, $str){
    $v1 = preg_quote($v1, '~');
    $v2 = preg_quote($v2, '~');
    if(preg_match("~$v1(.*)$v2~", $str, $tmp)){
       return $tmp[1];
    }else{
       return "";
    }
}

または、空のリターンがなくても、一致しない場合に$tmp[1]なります。null

于 2013-08-03T01:43:24.593 に答える
0

常に同じ形式を解析している場合は、次を試すことができますsscanf()

フォーマットを定義してから、正規表現マッチングを使用せずに変数を読み取るのは非常に便利です。

例えば。

$str = "[id]159828[/id][name][/name]";
sscanf($str, "[id]%d[/id][name]%[^[/name]]", $id, $name);

$id と $name には、(空の場合でも) 値が入力されます。

于 2013-08-03T01:46:20.207 に答える