[phpBB3] BBCode [url] Tag 支援中文網址

在 phpBB2 的時候就有發現這問題了,當時並沒有想去解決這問題,然而至今到了 phpBB3,依然出現這問題,不過我想這是因為中文網址的盛行,以及像 Wiki 之類都會有中文標籤,例如:一分鐘教室-userChrome.css,解決方法可以透過 urlencode 函式來處理掉網址編碼問題,在 phpBB 處理文章儲存,會先經過 bbcode 的處理,將 **** 標籤,會經過 get_preg_expression(‘url’) 這函式的驗證,看 url 是否合法,當然如果網址列有中文就不可能通過,所以必須在網址驗證之前,把網址編碼過,通過驗證之後再把網址解碼,這樣就沒問題了,底下為安裝步驟 打開 includes/message_parser.php 找尋

function validate_url($var1, $var2)
前面加入
/**
*  url encode
*
* @param string $string http url
*/

function encode_url($string)
{
    $entities = array('%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%3F', '%25', '%23', '%5B', '%5D');
    $replacements = array('!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "?", "%", "#", "[", "]");
    return str_replace($entities, $replacements, urlencode($string));
}
找尋

validate_url 函式

$url = ($var1) ? $var1 : $var2;
後面加入
// encode url 
$url = $this->encode_url($url);
找尋
return ($var1) ? '='.$this->bbcode_specialchars($url).':'.$this->bbcode_uid.'' . $var2 . '[/url:' . $this->bbcode_uid . ']' : ':'.$this->bbcode_uid.'' . $this->bbcode_specialchars($url) . '[/url:' . $this->bbcode_uid . ']';
取代
return ($var1) ? '='.$this->bbcode_specialchars($url).':'.$this->bbcode_uid.'' . $var2 . '[/url:' . $this->bbcode_uid . ']' : ':'.$this->bbcode_uid.'' . urldecode($this->bbcode_specialchars($url)) . '[/url:' . $this->bbcode_uid . ']';
測試結果,請參考此網址:

Re: 討論區判斷含中文鏈結的 bug


See also