2010-12-23 108 views
-1

我希望用戶能夠插入的標籤,如下列:使用PHP檢測標籤的最佳方法是什麼?

Lorem ipsum dolor sit amet, {module_user_name, 123} consectetur adipiscing elit. 

正如你可以在上面的例子中看到,標籤有幾個參數。第一個是所需的功能,參數取決於所請求的功能。

所以我會使用正則表達式來檢測{和},反饋?然後我會抓住第一個參數並檢查它是否存在。

如果確實存在,我會使用一個很好的命名約定來避免使用大量的IF ELSE或切換腳本。像module_user_name會觸發moduleUserName()函數或類似的東西,反饋?

**這只是我對如何解決這個問題的想法,我只是想知道如果任何人都可以改善或用速度指出任何問題等等

回答

2

我假設你的意思是某種形式的插件標記。那麼{的語法有點太輕了,它可能很容易與常規文本衝突;爲什麼更換應該謹慎做。這裏一個好的技巧是使用preg_replace_callback()像這樣:

$html = preg_replace_callback('/\{([\w\s,\d]+)\}/', "tags_", $html); 

function tags_($call) { 

    // split up 
    $func = explode(",", $call[1]); 
    $func = array_map("trim", $func); 

    // test for handler existence 
    if (function_exists($func[0])) { 
     return call_user_func_array(array_shift($func), $func); 
    } 

    return $call[0]; // do not replace 
} 

這裏命名用戶的功能,如果它存在只會被調用。如果找到類似{wacky text 123}的東西,那麼回調會將其返回並因此保持原始$html不變。

+0

首先,我忘了說謝謝你反饋在十二月。我一定非常忙,無法回覆。其次,如果我需要像{module_name,123,ABC,1A2B},{module_name,ABC,1}等多個參數,我不太喜歡正則表達式。我需要將正則表達式更改爲? – 2011-10-13 06:12:14

+0

這個正則表達式應該已經可以工作了。但是回調包含一個錯誤,應該說`if(function_exists($ func [0])){`。或者你有另一個錯誤? – mario 2011-10-13 06:17:45

0

如果它確實存在,我會使用良好的 命名約定來避免必須使用 大量IF ELSE或切換 腳本。像module_user_name 會觸發moduleUserName()函數,或 類似的東西,反饋?

這聽起來像自動裝載機上的變體,其中每個名稱映射到一個類/函數。如果你完全控制了命名,那應該不成問題。如果您必須支持現有標籤和/或命名約定不一致,則需要使用switch語句或類似命令。

事實上,這與Smarty如何進行函數調用類似。與編寫自己的解析器相反,您可以探索那個解析器。它的實現是完善的,可能比你第一次寫的更好。

2

我的建議是非常接近到什麼馬里奧已經給了你,但我想補充:

  • 你應該是一個更詳細的使用正則表達式,這樣的事情並不像功能忽略(例如{12345})

  • 如果你真的必須有「module_user_name」到「moduleUserName」的翻譯,那麼你應該設置此作爲數組,而不是一個開關:

    $標籤=陣列( /* user tag => php function */ 'module_user_name'=>'moduleUserName', 'module_user_id'=>'getUserId', //等 ); 如果(isset($標籤[$ FUNC])){ call_user_func($標籤[$ FUNC],...) }

避免開關(的原因)是因爲它就像一個執行一堆if/elseif語句,它需要更長的時間才能到達底部的情況,而數組有恆定的查找時間(我很確定是這種情況)。

  • 如果你不想保持一個巨型陣列(我不會),然後就決定你將使用爲每個用戶標籤的前綴,這樣{module_user_name, 123}轉換到PHP USER_TAG_module_user_name(123),只有通話功能從USER_TAG_開始。

  • 不要忘了提供一種方式讓用戶放在一個{沒有它越來越變成別的東西(即使用{{\{

相關問題