国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

技巧:PHP關于中文漢字替換與模式匹配的問題

2024-05-04 23:03:07
字體:
來源:轉載
供稿:網友

  這兩天正在做一個關鍵字加亮顯示的程序,寫好的程序在本地測試也跑得好好的,可是一上去頁面就出現一堆一堆的亂碼,別說加亮了,簡直就是沒的看!

  我就找錯誤,找來找去,發現英文沒有問題,遇到漢字容易出問題,有的時候遇到漢字必出問題。

  總結一下:

  當使用模式匹配的時候,如:preg_match_all($pat,……)與preg_replace($pat,……)……

  容易出問題的情況如下:
  preg_match_all("/(漢字)+/ism","我是漢字,看你把我怎么著!",$m_a);
  這個模式很簡單就是匹配出“漢字”。這種情況模式中包含漢字可以成功匹配出來,但是也不要高興得太早,結果不確定,為什么不確定你慢慢往下看。

  必出現問題情況如下:
  preg_match_all("/[漢字]+/ism","我是漢字,看你把我怎么著!",$m_a);
  本想匹配出現“漢”、“字”或者“漢字”。這個必出現問題,匹配的結果一大群亂碼,沒準還會出個死循環呢。為什么會出現這種情況?是因為php內部使用不是unicode,不支持多字節文字,所以一個"漢字"就被當成4bytes的ascii去進行模式匹配,不出錯才怪呢!

  后來我又試試重新寫一下模式匹配,發現一種似乎(為什么說似乎?往后看)方法可以解決:
  preg_match_all("/(漢|字)+/ism","我是漢字,看你把我怎么著!",$m_a);

  這樣寫可以匹配出“漢”、“字”或者“漢字”,$m_a中的結果

array
(
[0] => array
(
[0] => 漢字
)

[1] => array
(
[0] => 字
)

)

  怎么樣全匹配的字符串出現了吧!可是高興得太早了,后來在實際中用還是會經常出問題!再去找問題,終于找到問題的根了!php不支持多字節文字,所以在進行模式匹配與字符操作的時候都是內碼轉化后進行的(我不知道這樣說對不對),舉個實例吧:

  eregi_replace("性","沒有" , "有責任感");這個操作就是要把字符串"有責任感"中"性"字替換成"沒有",最后的結果是什么?因為"有責任感"中沒有"性"就個字,結果應該是沒有執行替換操作返回"有責任感",可是結果竟然是"用揮敘任感"!

  沒想到吧!為什么?看一下ascii碼你就明白了,2個ascii碼代碼一個漢字"有責任感"的ascii編碼依次為:211,208(有),212,240(責),200,206(任),184,208(感) 

  而"性"的編碼為:208,212(性),恰好與有的第2字節和責的第1字節組合是一致的!所以php就認識找到相同的模式進行匹配,拆成一半的漢字再與替換后的字串進行組合,所以就出錯了!

  當時我想最常用的str_replace(),應該不會有問題的,但是事實上str_replace()執行同樣的操作也會出錯!現在我想以前進行漢字替換實在是太幸運了!可能是那個時候進行的漢字替換都是比較長的漢字串吧,不太容易出現以上的情況。即使沒有出問題,也要知道那是不安全的!

  問題是有的,工作還要繼續做,克服的困難也就::::現在的自我了。

  好在想起一組php的擴展模塊,multibyte string functions,添加許多支持多字節文字的操作的函數,如:ereg_replace() 對應著mb_ereg_replace() 等等。具體的函數說明請查詢相關的文章。

  總結:對于中文漢字安全的操作最好是使用multibyte string functions。

  • 本文來源于網頁設計愛好者web開發社區http://www.html.org.cn收集整理,歡迎訪問。
  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    主站蜘蛛池模板: 成安县| 抚远县| 宽城| 东兰县| 勃利县| 来安县| 肇东市| 穆棱市| 若羌县| 石楼县| 福鼎市| 浙江省| 微山县| 威远县| 龙山县| 钟山县| 安图县| 隆昌县| 奈曼旗| 思茅市| 东阳市| 璧山县| 安平县| 闵行区| 竹山县| 富源县| 彭水| 宜君县| 鄂伦春自治旗| 武乡县| 宁夏| 昌宁县| 琼海市| 湖南省| 宁陵县| 句容市| 永州市| 昌都县| 南宫市| 陆良县| 贵州省|