[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

[phpBB3 外掛] 根據使用者文章數目限制簽名檔顯示

前一篇提到:『[教學] phpBB3 使用者簽名檔 url 連結加上 rel=”nofollow”』,本篇會將其做成後台,方便管理者可以從後台管理,這次加上一個新功能:『限制使用者顯示簽名檔』,根據使用者文章數量來決定是否顯示簽名檔,可以避免想要來打廣告的新註冊使用者,限制文章數量是一種方式,但是也不是最好的方式,phpBB3 本身可以在後台限制是否顯示使用者簽名檔,不過我想各大站長都會開放此功能,好讓使用者可以放個人網站或者是部落格,底下是外掛安裝方式:

安裝

打開 includes/acp/acp_board.php 找尋
#
# Find
#
'max_sig_img_height' => array('lang' => 'MAX_SIG_IMG_HEIGHT',        'validate' => 'int:0',  'type' =>    'text:5:4', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']),
後面加上
#
# after add
#
'max_sig_post_count_limit' => array('lang' => 'MAX_SIG_POSTS_LIMIT',   'validate' => 'int:0',  'type' =>    'text:5:4', 'explain' => true),
打開 viewtopic.php 找尋
#
# Find
#
if ($row['user_sig'] && $config['allow_sig'] && $user->optionget('viewsigs'))
取代
#
# Replace
#
if (($row['user_sig'] && $config['allow_sig'] && $user->optionget('viewsigs') && $row['user_posts'] >=                               $config['max_sig_post_count_limit']) || (isset($user->data['session_admin']) && $user->data['session_admin']))

中文化

打開 language/zh_cmn_hant/acp/board.php 找尋
#
# Find
#
'MAX_SIG_URLS_EXPLAIN' => '會員簽名檔中允許的最多連結數量。設定為 0,表示沒有限制。',
後面加上
#
# after add
#
'MAX_SIG_POSTS_LIMIT' => '簽名檔顯示與否',
'MAX_SIG_POSTS_LIMIT_EXPLAIN' => '會員文章數量超過多少才會顯示。設定為 0,表示沒有限制。',
請先參考 [教學] phpBB3 使用者簽名檔 url 連結加上 rel=”nofollow”,在依照底下安裝改成後台

安裝

打開 includes/acp/acp_board.php 找尋
#
# Find
#
'allow_sig_links' => array('lang' => 'ALLOW_SIG_LINKS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
後面加上
#
# after add
#
'allow_sig_nofollow' => array('lang' => 'ALLOW_SIG_NOFOLLOW', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
打開 viewtopic.php 找尋
#
# Find
#
$bbcode->bbcode_second_pass($user_cache[$poster_id]['sig'], $user_cache[$poster_id]['sig_bbcode_uid'], $user_cache[$poster_id]['sig_bbcode_bitfield'], true);
取代
#
# Replace
#
$check = ($config['allow_sig_nofollow']) ? true : false;
$bbcode->bbcode_second_pass($user_cache[$poster_id]['sig'], $user_cache[$poster_id]['sig_bbcode_uid'], $user_cache[$poster_id]['sig_bbcode_bitfield'], $check);

中文化

打開 language/zh_cmn_hant/acp/board.php 找尋
#
# Find
#
'ALLOW_SIG_SMILIES' => '允許在會員簽名檔中使用表情符號',
後面加上
#
# after add
#
'ALLOW_SIG_NOFOLLOW' => '增加會員簽名檔中網址連結設定 rel="nofollow"',
展示圖: phpBB3_02 phpBB3_01 phpBB3_03

[教學] phpBB3 使用者簽名檔 url 連結加上 rel=”nofollow”

基於 Moztw 討論區 有大陸使用者註冊之後,在簽名檔加入一些廣告連結,為了降低 Google Page Rank,所以我們必須指示搜尋引擎「不要前往此網頁上的連結」或是「不要前往此連結」,可以參考 關於 rel=”nofollow”phpBB3 編輯三個檔案就可以了,此修改不影響文章內容,只有針對簽名檔作用,底下是 patch 程式碼,可以參考看看 includes/bbcode.php
--- phpBB3/includes/bbcode.php  2010-03-06 04:37:23.000000000 +0800
+++ www/includes/bbcode.php     2010-06-10 20:58:02.000000000 +0800
@@ -2,7 +2,8 @@
 /**
 *
 * @package phpBB3
-* @version $Id$
+* @version $Id: bbcode.php 9461 2009-04-17 15:23:17Z acydburn $
+* @log 2010-06-10 appleboy $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -48,7 +49,7 @@
        /**
        * Second pass bbcodes
        */
-       function bbcode_second_pass(&$message, $bbcode_uid = '', $bbcode_bitfield = false)
+       function bbcode_second_pass(&$message, $bbcode_uid = '', $bbcode_bitfield = false, $bbcode_is_sig = false)
        {
                if ($bbcode_uid)
                {
@@ -110,6 +111,13 @@
                                                }

                                                $message = preg_replace($preg['search'], $preg['replace'], $message);
+
+                                               /*
+                                                * 2010.06.10 add search nofollow module by appleboy
+                                                */
+                                               $replace = ($bbcode_is_sig === true) ? 'rel="external nofollow"' : '';
+                                               $message = preg_replace("/\{NOFOLLOW\}/i", $replace, $message);
+
                                                $preg = array('search' => array(), 'replace' => array());
                                        }
                                }
styles/Moztw-2009-1.0.6/template/bbcode.html
--- phpBB3/styles/subsilver2/template/bbcode.html       2010-03-06 04:37:24.000000000 +0800
+++ www/styles/Moztw-2009-1.0.6/template/bbcode.html    2010-06-10 17:20:32.000000000 +0800
@@ -52,7 +52,7 @@

 {L_IMAGE}

-{DESCRIPTION}
+{DESCRIPTION}

 {DESCRIPTION}
www/viewtopic.php
--- phpBB3/viewtopic.php        2010-03-06 04:37:23.000000000 +0800
+++ www/viewtopic.php   2010-06-10 20:27:06.000000000 +0800
@@ -1342,7 +1278,8 @@

                if ($user_cache[$poster_id]['sig_bbcode_bitfield'])
                {
-                       $bbcode->bbcode_second_pass($user_cache[$poster_id]['sig'], $user_cache[$poster_id]['sig_bbcode_uid'], $user_cache[$pos
ter_id]['sig_bbcode_bitfield']);
+                       // 2010.06.10 add search nofollow module by appleboy
+                       $bbcode->bbcode_second_pass($user_cache[$poster_id]['sig'], $user_cache[$poster_id]['sig_bbcode_uid'], $user_cache[$pos
ter_id]['sig_bbcode_bitfield'], true);
                }

                $user_cache[$poster_id]['sig'] = bbcode_nl2br($user_cache[$poster_id]['sig']);

phpBB 3.1 版本將不再支援 PHP4

phpBB 官方網站看到這篇:『phpBB 3.1 to discontinue support for PHP versions below 5.2』,內容大致上是說 phpBB 3.0 “Olympus” 系列的版本將是 phpBB 支援 php 4 最後一個版本,之後所推出的 phpBB 3.1 “Ascraeus” 版本,PHP 需要 5.2 或者是更高才可以正確執行。隨著 3.1 版本的推出,3.0 將會繼續維護 6~9 個月的時間,這版本將會繼續維持相容於 php 4 系統。 由於 phpBB 3.1 還處於開發的階段,尚未決定發佈日期,所以大家還是有很多時間可以將 php 升級到 5.2.0 或者是更高。看到 phpBB 可以捨棄 php 4 還蠻高興的,自己本身玩 phpBB 多年,看到 2.0 到 3.0 的變化蠻大的,php 4 安全姓做的非常不好,所以導致 code 非常隴長,希望 3.1 可以快點推出。