PHP 網誌庫存

0

[PHP] BBCode Parser (簡單的BBCode to HTML 的function)

最近有個web2.0的project,安全理由當然不會讓用戶用HTML發表內容

所以就選擇上一些BBCODE 的編輯框,保存到SQL是BBCODE這個問題不大

但解讀時就需要用PHP來翻譯一下BBCODE,將BBCODE轉義為HTML

基本上都知怎麼做,但想取一下靈感就上網找一些簡單的class , function 起步

github有非常多,但因為我自己個人對編輯器做了特殊的修改,所以用別人的class會有些不便,同時有些作品太過大型,我想小巧易改一點

所以就想了下面這個簡單的function開始

基本上沒有特別功能的可以直接使用

但我認為還需要加2~3個功能:
1. 表情附號的轉義
2. 自動感應link / 圖片型的網址 / youtube 等等

<?php

/* Simple PHP BBCode Parser function */

//BBCode Parser function

function showBBcodes($text) {

// BBcode array
$find = array(
'~\[b\](.*?)\[/b\]~s',
'~\[i\](.*?)\[/i\]~s',
'~\[u\](.*?)\[/u\]~s',
'~\[quote\](.*?)\[/quote\]~s',
'~\[size=(.*?)\](.*?)\[/size\]~s',
'~\[color=(.*?)\](.*?)\[/color\]~s',
'~\[url\]((?:ftp|https?)://.*?)\[/url\]~s',
'~\[img\](https?://.*?\.(?:jpg|jpeg|gif|png|bmp))\[/img\]~s'
);

// HTML tags to replace BBcode
$replace = array(
'<b>$1</b>',
'<i>$1</i>',
'<span style="text-decoration:underline;">$1</span>',
'<pre>$1</'.'pre>',
'<span style="font-size:$1px;">$2</span>',
'<span style="color:$1;">$2</span>',
'<a href="$1">$1</a>',
'<img src="$1" alt="" />'
);

// Replacing the BBcodes with corresponding HTML tags
return preg_replace($find,$replace,$text);
}

// How to use the above function:

$bbtext = "This is [b]bold[/b] and this is [u]underlined[/u] and this is in [i]italics[/i] with a [color=red] red color[/color]";
$htmltext = showBBcodes($bbtext);
echo $htmltext;

?>
標籤:
0

用mb_strwidth將utf8中文作2個字元計算

有時候使用UTF8想計算文字的數量時,很簡單很常見就是

最常見的計算方式:

strlen("中文字abcd1234")

結果:17
分析:中文字=9字元(3文字*3字元) + 8個字元 (英數1文字=1字元)

mb_strlen("中文字abcd1234",'UTF-8')

結果:11分析:中文字=3字元 (3文字*1字元) + 8個字元 (英數1文字=1字元)

最常見的統計是這兩個字方法來計算,
但1個中文字以3個字元計算,在前台視覺上有點不合邏輯。
在一些討論區或者註冊會員時,都會看到限制會員名長度,一般中文會當2個字元,比如會員名限制不得多於10個字元,就代表可以使用10個英/數字,或者5個中文字
php有個內置函數,直接可以將中文以2個字元計算

$utf8_text = mb_strwidth("測試123",'UTF-8');
echo $utf8_text;

做個視覺上的測試
1234567890 (mb_strwidth 10字元)
一二三四五 (mb_strwidth 10字元)
這樣看來是否覺得合理很多? 長度選擇中英會員名的用戶在長度限制上是否更公平?

0

PHP頁面出現Incompatible file format的解決方法

造成該問題的原因是Zend Guard 5.1更新了加密PHP文件的算法來迎合PHP5.3新版本支持,用Zend Guard老版本加密過的PHP文件在 PHP5.3 + Zend Guard Loader的環境下都無法正常瀏覽,會報出文章開頭的錯誤。

解決方法:
可以把PHP程序源文件在Zend Guard 5.1下重新加密,然後才能瀏覽。本處因為拿到的就是加密商業代碼,故放棄這一招。
也可以把程序放到PHP5.2 + Zend Optimizer的環境下運行即可。本處選擇它來運行這套加密程序。

0

[解決] Undefined class constant 'MYSQL_ATTR_INIT_COMMAND'

最近遇到一個php的問題,發現pdo連結時一直發生一個錯誤

 Undefined class constant 'MYSQL_ATTR_INIT_COMMAND'.........

我是因為使用了 MYSQL_ATTR_INIT_COMMAND 來設定CHARSET編碼,所以發生錯誤

$this->_pdo = new PDO(DB_DNS, DB_USER, DB_PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND=>'SET NAMES '.DB_CHARSET));

後來出現了這句ERROR

Undefined class constant 'MYSQL_ATTR_INIT_COMMAND'

網上搜尋了很多很多相關的解決方法,無一可解決,當然比如說可以用exec()來執行等等...但想了想終不是辦法,後來拜託朋友幫手解決,才得知可能是PHP.INI設定問題!

其實PDO應該要用到兩個extension,但不知為何我自己本機測試的PHP只開了php_pdo.dll 卻沒有開啟php_pdo_mysql.dll ,所以導致PDO無法訪問MYSQL才可能出現這個錯
修改如下

打開「php.ini」→ 搜尋「pdo」→ 找到下面兩行代碼 → 如果前面有「;」 → 去掉就可 → 「重開Apache」

如果找不到,手動加上在extension的代碼部分就可以

正確

extension=php_pdo.dll
extension=php_pdo_mysql.dll

錯誤

;extension=php_pdo.dll
;extension=php_pdo_mysql.dll

我自己是因為php_pdo_mysql.dll沒有打開而發生錯誤,其實是否正常的解決方法,或者邏輯是否正常我不知道(可能有些人開了也有這個問題),終知我解決了自己的問題,不過提一提各位,終言知如果要用PDO去操作MYSQL,這兩個extension是應該要打開的。

標籤:
0

PHP也可以寫開發APP了!

Zend官方的橫幅廣告,Zend已公開發布了Zend Studio 10 (Beta),Zend Studio 10平台可以令PHP程式設計員可以在熟悉的語言中開發移動網絡的原生應用程式

Zend Studio簡介:Zend Studio是由Zend開發的一個提供給PHP開發者編寫PHP的軟件。 閱讀全部 »

0

5個常用經典的MySQL語法教學

本文章將介紹5個常用的經典MySQL語法教學給各位,當然部分功能可以用php來達到效果,但同時亦可以用mysql來做,喜歡用哪個方法就按自己對哪個語法較熟悉來操作。

1. 查詢你的數庫容量有多少

SELECT
  table_schema AS 'TEST',
  Round( Sum( data_length + index_length ) / 1024 / 1024, 3 ) AS 'Db Size (MB)',
  Round( Sum( data_free ) / 1024 / 1024, 3 ) AS 'Free Space (MB)'
FROM information_schema.tables
GROUP BY table_schema ;

2. 查找表中的主鍵(PRIMARY KEY)

 SELECT k.column_name
FROM information_schema.table_constraints t
JOIN information_schema.key_column_usage k
USING (constraint_name,table_schema,table_name)
WHERE t.constraint_type='PRIMARY KEY'
  AND t.table_schema='db'
  AND t.table_name=tbl'

3. 顯示數據庫結構

DESCRIBE mytable;  

4. 計算生日

SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(now()) - TO_DAYS(@dateofbirth)), '%Y') + 0;

5. 兩個時間的時間差

UNIX_TIMESTAMP( dt2 ) - UNIX_TIMESTAMP( dt1 )

多記錄MySQL常用語法可有利提高開法網站或數據庫的速度。

0

被PHP5.3廢除的函數該用哪些函數來取來? (列表及取代者函數)

PHP5.3有部分函數(function)已被廢除,網上找到不少取代的函數,希望升級5.3後發現錯誤的朋友,可以對你們有幫助。

以下內容由網上轉載: 

  作廢函數如下:

  call_user_method()(使用 call_user_func() 替代)

  call_user_method_array() (使用 call_user_func_array() 替代)

  define_syslog_variables()

  dl()

  ereg() (使用 preg_match() 替代)

  ereg_replace() (使用 preg_replace() 替代)

  eregi() (使用 preg_match() 配合 ‘i’ 修正符替代)

  eregi_replace() (使用 preg_replace() 配合 ‘i’ 修正符替代)

  set_magic_quotes_runtime() 以及它的別名函數 magic_quotes_runtime()

  [color=olive]session_register() (使用 $_SESSION 超全部變量替代)

  session_unregister() (使用 $_SESSION 超全部變量替代)

  session_is_registered() (使用 $_SESSION 超全部變量替代)

  set_socket_blocking() (使用 stream_set_blocking() 替代)

  split() (使用 preg_split() 替代)

  spliti() (使用 preg_split() 配合 ‘i’ 修正符替代)

  sql_regcase()

  mysql_db_query() (使用 mysql_select_db() 和 mysql_query() 替代)

  mysql_escape_string() (使用 mysql_real_escape_string() 替代)

  廢棄以字符串傳遞區域設置名稱. 使用 LC_* 系列常量替代.

  mktime() 的 is_dst 參數. 使用新的時區處理函數替代.

  處理方法:editplus編輯器中,正則替換

  替換ereg(),eregi():用preg_match替換

  ereg\("([^"]+)"替換為:preg_match("/\1/"

  ereg\('([^"]+)'替換為:preg_match('/\1/'

  eregi\("([^"]+)"替換為:preg_match("/\1/i"

  eregi\('([^"]+)'替換為:preg_match('/\1/i'

  替換ereg_replace(),eregi_replace():用preg_replace()替換

  ereg_replace\("([^"]+)"替換為:preg_replace("/\1/"

  ereg_replace\('([^"]+)'替換為:preg_replace('/\1/'

  ereg_ireplace\("([^"]+)"替換為:preg_replace("/\1/i"

  ereg_ireplace\('([^"]+)'替換為:preg_replace('/\1/i'

  如果 ereg_replace 的第一個參數不是正則表達式,可以用 str_replace 直接來替換

  split用explode替換或preg_split替換

標籤:
0

PHP顯示的時間有錯? 修改PHP時區設定(date.timezone)

方法一. 修改伺服器的php.ini

打開php.ini,搜尋: date.timezone

把該行改為:

date.timezone = Asia/Taipei

  方法二. 修改自己的PHP檔案,在核心檔案或經常被引用的文件(如:config),加入以下PHP代碼設定時區

<?php
ini_set('date.timezone','Asia/Taipei'); 
?>
0

[解決PHP常見問題] Warning: Cannot modify header information - headers already sent by

Warning: Cannot modify header information - headers already sent by ....
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent ....

一般問題都會出現於使用session_start()時發生的,

個人最建議使用方法1,因為最直接及合理
比如:
第一行是 第二行是session_start();
就能解決,不必去開啟緩衝區解決,更不建議為此事而修改php.ini

以下內容轉載於網絡

解決方法1
1. 確定 <?php 和 session_start() 之間沒有其他字元,空格也要移除。
2. 若是 UTF-8 編碼,請用編輯器(例 UltraEdit、Notepad++...)將檔案裡的 BOM 移除。

解決方法2
以 ob_start() 開啟緩衝區將輸出資訊寫入緩衝區,可避免 headers 先於 session_start() 輸出,寫入緩衝區的內容可由 flush() 或 ob_end_flush() 輸出至瀏覽器,以下範例不會顯示錯誤訊息:
<?php
ob_start();
echo "test";
session_start();
ob_end_flush();
?>

0

PHP 時間顯示控制

echo $time = mktime();

$srttime=date("w",time());
 $array=array('天','一','二','三','四','五','六');

//ampm中文化顯示上午及下午
 function ampm ($i) {
 switch($i){
 case 0:
 echo '上午';
 break;
 case 2:
 echo '下午';
 break;
 }
 }

$a=date("a",time());
 $array2=array('am'=>'上午','pm'=>'下午');

echo "
";
 echo date("Y年m月d日 星期{$array[$srttime]} {$array2[$a]} h:i:s ", $time);
 echo "
";
 echo date("Y年m月d日 星期{$array[$srttime]}", $time);
 echo "
";
 echo date("Y年m月d日 {$array2[$a]} h:i:s ", $time);
 echo "
";
 echo date("Y年m月d日 A h:i:s ", $time);
 echo "
";
 echo date("Y-m-d l A h:i:s ", $time);

?>