2011-08-11 46 views
2

我的方法解析字符串並用字符串中包含的信息做東西。 一個簡單的例子是php自定義用preg解析字符串

$string= 
" 
    user:name,password={$_POST['name']}, {$_POST['password']}(md5); 
    names:name=name; 
"; 
$class->$method($string); 

上面會做兩個INSERT語句。第一個將在名爲user的表中插入用戶名和在md5中加密的密碼。
第二個會在名稱表中插入一個名稱。我正在設置它,以便字符可以逃脫。即如果用戶名是p; ez。該字符串會有p \; ez。
我當前方法如下

#get position of ; 
    $offsetSemi=stripos($s, ";"); 
    #check if its escaped 
    if ($s[$offsetSemi-1]!='\\') 
    { 
     //not escaped 
    } 

與上述方法中的問題是,它將僅檢查的第一個實例; 我試過的另一個解決方案是爆炸字符串。然而,這是行不通的,因爲它在包括逃跑者在內的所有事件中都爆炸了。我嘗試另一件事是一個具有低於

/[^\\\];/ 

正則表達式爆炸與此prolem是它之前分解的性格特徵;在所有沒有逃脫的實例上。有沒有一種方法可以在所有實例上爆炸字符串;沒有前面加反斜槓?

+1

您的輸入**是否具有這種複雜的格式?如果不是的話,你應該考慮使用內置在解析器中的格式,比如XML上的JSON。 – PPrice

+0

不,它不。我不熟悉json或xml。我聽說過他們,但從未學過或使用過它們。你能提出一個解析XML或JSON的例子嗎? – Yamiko

回答

2

相反,爆炸可以解析字符串:

$arr = array(); 
$tmp = ""; 

for ($i = 0; $i < strlen($s); $i++) { 
    switch ($s[$i]) { 
     case "\\": 
     if ($i < strlen($s) - 1) $tmp .= $s[$i++] . $s[$i++]; 
     break; 
     case ";": 
     $arr[] = $tmp; 
     $tmp = ""; 
     break; 
     default: 
     $tmp .= $s[$i]; 
    } 
} 

if (strlen(trim($tmp)) > 0) { // last section 
    $arr[] = $tmp; 
} 
+0

存儲除最後一部分以外的所有內容。 – Yamiko

+0

@yamikoWebs:顯然'$ tmp'包含'for'循環後的最後一部分。無論如何,我編輯我的答案,包括'$ arr'中的最後一節。 – fardjad

0

編寫一個解析器。首先標記您的輸入,然後查看它。

2

考慮使用JSON對您輸入格式。既然你使用PHP,你可以看看這個intro to JSON and PHP。此外,您將需要使用json_encode()json_decode()。使用這些函數,您可以輕鬆地將JSON字符串轉換爲PHP對象或關聯數組,並在需要時再返回。如果您從內置解析幫助的格式開始,則無需擔心標記化/解析步驟。

如果你想使用XML,那麼你可以使用SimpleXMLDOM。但是,通過使用JSON最適合您。