2011-06-27 150 views
2

我正在一個社交網站上工作。發送通知時,例如,您可以在發送的文本中以開發人員身份在通知中鍵入[user:20:name]。所以說,我送自定義標記與Php

「[用戶:20:名字]在您的[視頻:8:名稱,鏈接]視頻」

它會顯示爲「鮑勃對您的iOS 5回顧視頻評論」。

所以它會看到用戶,看到用戶ID,我想要這個名字,然後它會在它需要的數據庫中完成工作,並用Bob替換字符串中的[user:20:name]。

對於視頻,它會知道我想要視頻8的名稱作爲鏈接。我將如何解析這樣的事情?我已經知道如何從數據庫中獲取數據。只是停留在這一部分。任何想法如何?

其中一個想法是通過自己獲取每個[標記],並對每個標記進行解析,然後在獲取標記的處理版本時對其進行str_replace處理。

不知道我怎麼會得到每個[標記]它自我。

回答

4

不知道這是太簡單了,它不與多個標籤處理在一個字符串,但你可以嘗試這樣的事情作爲一個起點:

<?php 

// the original string 
$str = 'User [user:20:name] did foo bar.'; 

// find the tag 
preg_match('/(?<=\[)[a-z0-9:]+(?=\])/', $str, $tags);  

// build a db query 
list($table, $id, $field) = explode(':', $tags[0]); 
$sql = sprintf('SELECT %s FROM %s WHERE id = %d', $field, $table, $id); 

// DB query... returns user 'Bob' 
$user = 'Bob'; 

// replace the original tag with the user's name 
$output = preg_replace('/\[user:\d+:name\]/', $user, $str); 

更新

對於您可以使用多個標記preg_match_all(),然後遍歷$tags數組,可能使用$table變量作爲構建查詢數據數組的關鍵字......您必須決定使用此數據查詢您的最有效方式數據庫,基於你的數據庫實現。如果可以使用PDO準備的語句可能會很好。所以會緩存你的輸出,因爲你不想預先匹配並且每次都替換所有的輸出......或者只是一次執行這個操作並將輸出存儲在數據庫中。

0

你的意思是這樣的嗎?

<?php 
    $string = "[video:8:name,link]"; 
    $string = trim($string, "[]"); 

    $videoMetaData = explode(",", $string); 
    $nameArray = explode(":", $videoMetaData[0]); 

    $name = $nameArray[2]; 
    $link = $videoMetaData[1]; 

    echo "<a href='".$link."'>".$name."</a>"; 
+0

多標籤呢? – Keverw