为什么这不起作用?
<?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。
谢谢!
答案 0 :(得分: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]"
}。
这意味着$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将填充(甚至为空)值。