2013-08-03 52 views
1

爲什麼不能正常工作?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] 

工作正常。如果找不到它,我需要它返回任何東西。

謝謝!

+0

如果這些字段之間沒有任何內容,'$ dd'首先等於0,然後更改爲結果的長度。這使得你最終調用'substr($ result,0,7)'。如果在名稱括號之間有一個值'$ dd'永遠不會設置爲0,並且次要分配不會發生。擺脫'if($ dd == 0)...'塊。 – Mike

+0

如果'$ pool'是'GetBetween()'的必需參數,則不需要爲'$ var1'和'$ var2'設置默認值。如果您想讓其他選項可用,請將'$ pool'作爲第一個參數。 – ironcito

回答

1

一切工作正常,直到$result。您有:

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

我們有$temp1 = 15,並strlen($pool) = 22,所以這相當於:

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

你可能想在這裏省略$length說法,讓substr僅返回字符串的其餘部分無論哪種方式,$result等於"[/name]"

這意味着$dd將等於0,因爲$resultstrposstrpos處於最初。然後,if()聲明將$dd更改爲strlen($result),即7。然後,返回值爲substr($result,0,$dd)$substr("[/name]",0,7),計算結果爲"[/name]"

要解決此問題,您需要完全刪除if()聲明。

這樣,$dd保留爲零,因此return值是一個零長度的子字符串,這是你想要的:一個空字符串。

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); 
} 
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如果沒有匹配。

0

如果你總是解析相同的格式,你可以嘗試sscanf()

這是相當不錯的定義的格式,然後讀出的變量不使用正則表達式匹配。

例如。

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

$ id和$ name將填充(甚至爲空)值。

相關問題