PHP在括号标记之间获取字符串

时间:2013-08-03 01:24:01

标签: php

为什么这不起作用?

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

如果那里有什么东西可以正常工作。如果找不到它,我需要它返回NOTHING。

谢谢!

4 个答案:

答案 0 :(得分:1)

$result之前,一切正常。你有:

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

我们有$temp1 = 15strlen($pool) = 22,所以这相当于:

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

您可能希望在此处省略$length参数,以便substr只返回位置15之后的字符串的其余部分。无论哪种方式,$result等于"[/name]" }。

这意味着$dd将等于0,因为strpos"[/name]"的{​​{1}}位于最开头。 $result语句然后将if()更改为$dd,即7.然后,返回值为strlen($result)substr($result,0,$dd),其值为{{1 }}

要解决此问题,您需要完全删除$substr("[/name]",0,7)语句。

这样,"[/name]"保留为零,因此if()值是零长度的子字符串,这是您想要的:空字符串。

答案 1 :(得分: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);
}

答案 2 :(得分: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

答案 3 :(得分:0)

如果您始终在解析相同的格式,则可以尝试sscanf()

定义一种格式然后在不使用正则表达式匹配的情况下读出变量是非常好的。

例如

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

$ id和$ name将填充(甚至为空)值。