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

只需添加此检查:

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

您可以使用正则表达式来匹配两个值之间的内容。例如

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 回答
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]"

这意味着 that$dd将等于 0,因为strposin"[/name]"位于$result最开始。该if()语句随后变为$ddstrlen($result)即 7。然后,返回值为substr($result,0,$dd),或$substr("[/name]",0,7),其计算结果为"[/name]"

要解决此问题,您需要完全删除该if()语句。

这样一来,$dd它就保持为零,因此该return值是一个长度为零的子字符串,这就是您想要的:一个空字符串。

于 2013-08-03T01:35:43.633 回答
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 回答