php 正則匹配unicode,PHP中正則表達式對UNICODE字符碼的匹配方法

網友ainiaa的問題是

PHP代碼如下

代碼如下:$words = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSRUVWXYZ!@#$%^&*()_+-=[]\\,./{}|<>?'\"你好啊我們";

$otherStr=preg_replace("/[chr(128)-chr(256)]+/is"," ",$words);

echo 'otherStr:',$otherStr;

為什么打印的結果會是:

otherStr: ! #$% & {}| ‘”你好啊我們

麻煩問下其中正則表達式 /[chr(128)-chr(256)]+/is 代表什么意思?

如果/[chr(128)-chr(256)]+/is 指的是ascii碼在128到256的字符,為什么a-zA-Z這樣的字符也被替換掉了,他們的ascii碼是小于127的。

最令人郁悶的是為什么ascii碼同在0-127區間”#”,”$”,”%”,”&”, “!”,” {“,”}”,”|”,” ‘”,”確沒有被替換掉????

更令人感覺神奇的是 如果把正則表達式修改為”/[chr(128)-chr(256)]+/s”的話,輸出的結果就變成了: otherStr: defg ijklmnopq stuvwxyz ! #$% & {}| ‘”你好啊我們

只是把正則表達式中的符號‘i'給去掉,結果缺失這樣的。 完全的令我理解不了。

不知各位 有何見解????

另附ascii 碼 對照表

(這個ASCII碼表的圖我就不貼了)

回帖中,有個網友說沒解析chr(128)這些,并給出了新的解決方法。首先說下此網友回答的是正確的,先不評論他是否“知其然,且知其所以然”,這位網友沒有給出錯誤的原因。

CFC4N來回答一下這位網友:

PHP的正則的preg_match函數用的是PCRE正則引擎,這位網友的代碼中,PCRE引擎處理的正則表達式為【/[chr(128)-chr(256)]+/is】,后面的is是什么呢?

在PHP的正則里,邊界字符后面的叫模式修飾符。它會告訴引擎如何解析,處理正則。其中i修飾符表示不區分大小寫。s表示“點號通配模式”,用來讓正則里的元字符點號【.】可以匹配換行符,這個修飾符僅對點號【.】起作用。在這位網友的問題中,修飾符s并不起作用的。

查找原因:

我們在來分析一下這個網友寫的正則表達式【[chr(128)-chr(256)]+】,正則表達式的PCRE引擎是如何解釋這個正則的呢?首先,我們要知道,在正則表達式中,中括號【[]】表示字符組,字符組中除了連接符【-】只外,都不是元字符,也就是說,都是普通字符,當然,如果連字符出現在第一個,或者不是標識兩個字符之間范圍的,都是普通的字符橫杠“-”罷了。這里的chr(128)只是標識ASCII碼為128(確切的說,ASCII碼只是0-127個,128到其他的,應該不叫ASCII碼了。),但是在正則里,他仍然代表【c、h、r、(、1、2、8、)】(頓號不是,只是區分易讀的)這八個字符罷了。這個正則里的連接字符,是哪些范圍呢?很明顯,這里的連接字符的范圍是【)-c】,“)”ASCII碼為0×29,也就是十進制的41;“c”的ASCII碼為0×63,也就是十進制的99,那么,他這個連接字符的范圍就是ASCII 41(chr(41))到ASCII 99(chr(99))之間的字符。也就是說,這位網友的正則的范圍是【[hr)-c(]】,就是chr(41)到chr(99)外加hr這兩個字母和前面的“(”。

網友第一次測試的時候,有修飾符i,意思就是說,不區分大小寫,那么在chr(41)到chr(99)之間的字符,以及這些字符如果有大小寫,則包括他們的大小寫都符合匹配。都會被替換成空。其第二次測試的時候,去掉了修飾符i,進行了不區分大小寫的匹配,由于其范圍只到c,但突然,再除了小寫字母的“h”、“r”,所以,測試結果會多出“defgijklmnopqstuvwxyz”。所以,他的結果出現了這些差別。

c5a42baaba92f43106e2dd2526e78c7c.png

網友的表達式等同于如下圖所示

019a0bfb4bf3d5ca7e7407c5ad4688df.png

解決辦法:

錯誤的原因找出來了,那么,解決的辦法呢?

我們先來看看這位網友的需求,他的需求是將unicode(ASCII只是0-127位的,128之后的,應該叫UNICODE碼)的chr(128)到chr(255)之間的字符匹配,替換為空罷了。正則表達式里,對十六進制的字符匹配的表示方式有兩種,【\u】和【\x{}】,前者只能表示【\u】后面4位的十六進制數值,而后者【\x{}】則可以表示任意多的十六進制位數(寫在大括號中)。

那么,這個正則表達式該如何寫????

網友的目的是chr(128)到chr(255),那么就是【[\u0080-\u00FF]】或者【[\x{0080}-\x{00FF}]】。

其目的是匹配下圖中的紅框內字符

477531df9deba5762335cc1014113dff.png

提醒一下,PHP里正則匹配unicode字符時,需要使用u修飾符。

根據網友需求,更改正則之后的PHP代碼如下:

代碼如下:$words = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSRUVWXYZ!@#$%^&*()_+-=[]\\,./{}|<>?'\"你好啊我們";

$otherStr=preg_replace("//[\x{0080}-\x{00FF}]+/iu"," ",$words);

echo 'otherStr:',$otherStr;

其運行結果是仍然輸出那段字符串,為什么呢?因為哪些字符串都不在chr(128)到chr(255)的范圍之內。

(測試時,注意文件編碼為UTF-8)

以上為鄙人愚見,歡迎批評指正。

本條技術文章來源于互聯網,如果無意侵犯您的權益請點擊此處反饋版權投訴

本文系統來源:php中文網

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443206.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443206.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443206.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iis7怎么安裝php7,Linux下如何安裝php7

Linux下安裝php7的方法&#xff1a;首先安裝依賴包&#xff0c;并下載解壓安裝包&#xff1b;然后檢查環境的依賴關系&#xff0c;并編譯安裝&#xff1b;接著將【php.ini-production】改名為【php.ini】&#xff1b;最后復制啟動腳本&#xff0c;并啟動PHP即可。Linux下安裝ph…

php長輪詢阻塞,ajax長輪詢時php被阻塞

剛接觸實時通訊這塊&#xff0c;知道用websocket更高效&#xff0c;但我想了解輪詢的實現過程&#xff0c;循序漸進短輪詢用定時器setInterval已經實現了&#xff0c;但長輪詢時后臺進入死循環模塊導致整個網站的php網頁無響應&#xff0c;比如刷新頁面、提交消息都沒法進行。具…

php隱藏路徑ngnix,thinkphp框架在nginx環境下去掉index.php路徑顯示

協助用戶將apache下的一個網站遷移到nginx環境中&#xff0c;結果發現用戶用的ThinkPHP框架做的開發&#xff0c;默認用的pathinfo。這是一個很頭疼的問題&#xff0c;因為nginx不支持pathinfo&#xff0c;貿然一并打開也擔心不安全。于是查詢資料后整理如下&#xff1a;找到ap…

php curl 數據采集 空,PHP curl從網站返回空數組的數據

我想寫一個PHP腳本來從www.snowbird.com/mountain-report/拉雪和其他數據通過LED陣列顯示。我在獲取需要的數據方面遇到麻煩。我似乎無法找到使其工作的方法。我能做這項工作嗎&#xff1f;還是我需要去使用另一種語言&#xff1f;PHP curl從網站返回空數組的數據以下代碼僅返回…

flux react php,Vue的Flux框架之Vuex狀態管理器

學習vue之前&#xff0c;最重要是弄懂兩個概念&#xff0c;一是“what”&#xff0c;要理解vuex是什么&#xff1b;二是“why”,要清楚為什么要用vuex。Vuex是什么&#xff1f;Vuex 類似 React 里面的 Redux 的狀態管理器&#xff0c;用來管理Vue的所有組件狀態。為什么使用Vue…

php config(),php config

PHP 的安裝由于php是一個zip文件(非install版)&#xff0c;安裝較為基本解壓就行。把解壓的 php5.2.1-Win32重命名為 php5。并復制到安裝盤目錄下。例如安裝路徑為 c:\php51 找到php目錄下的 php.ini-dist或 php.ini.recommended文件&#xff0c;重命名為 php.ini,并復制到系統…

functions.php 在哪,functions.php常用函數

在設計WordPress主題時&#xff0c;在functions.php文件里添加一套通用的自定義函數將會大大提高開發效率&#xff0c;這樣就不必每次開發主題時都需先查找然后復制同樣的函數。這里記錄一些常用的函數&#xff0c;方便以后使用&#xff01;給頭部添加feed鏈接WordPress2.8以后…

java基本數據類型存儲,JAVA - 基本數據類型的存儲空間長度

1.整型類型 存儲需求 bit數 取值范圍 備注byte 1字節 1*8 &#xff0d;128&#xff5e;127short 2字節 2*8 &#xff0d;32768&#xff5e;32767int 4字節 4*8 (-2的31次方到2的31次方-1)long 8字節 8*8 (-2的63次方到2的63次方-1) 長整型數值后綴為LJAVA 沒有無符號類型JAVA中…

matlab回調函數,matlabGUI回調函數介紹.pptx

matlabGUI回調函數介紹GUI開發環境的常用工具與回調函數和GUI程序文件GUI開發常用工具1、控件面板2、對象對齊工具3、對象瀏覽器4、tab順序編輯器5、屬性編輯器6、菜單編輯器7、M文件編輯器回調函數回調函數是控件接收到用戶的操作時調用的特定函數&#xff0c;每個回調函數都是…

余額交易查詢 php,深圳通余額查詢的API

深圳通余額查詢的API&#xff0c;可以通過深圳通號碼查詢到余額及卡有效期等信息。 用到Domxpath和Curl兩方面的知識。 源碼已托管到github&#xff0c;另外要加載個類&#xff1a;myclass 項目地址&#xff1a;https://github.com/skiy/dev 演示&#xff1a;http://api.oupag.…

食餌捕食者模matlab,幾類食餌-捕食者模型的定性分析和數值模擬

摘要&#xff1a;生態問題一直是人們普遍關注的問題,特別是生態問題中的食餌-捕食者模型,則處于舉足輕重的位置。如何更有效的控制、調節生物種群,使之保持良性發展,則具有非常重要的生態意義和應用價值。解決這類問題的主要工具是種群動力學模型,解決的依據是數學的理論和方法…

數組填充php,php數組入門教程之數組填充

本文介紹下&#xff0c;有關php數組之數組填充的一個例子&#xff0c;有需要的朋友參考下。在php編程中&#xff0c;對數組元素進行填充&#xff0c;可以使用array_fill()函數。來看下面的例子&#xff0c;array_fill()函數——填充數組函數&#xff1a;";print_r ($array…

php在類定義一個我靜態變量,php中靜態類與靜態變量用法的區別分析_PHP教程

php中靜態類與靜態變量用法的區別分析static是定義一個靜態對象或靜態變量,關于static 定義的變量或類方法有什么特性我們看完本文章的相關實例后就見分曉了.1. 創建對象$object new Class()&#xff0c;然后使用”->”調用&#xff1a;$object->attribute/function&…

matlab 排序點,matlab如何進行排序?

來自SORT的MATLAB文檔&#xff1a;If A has complex entries r and s,sort orders them according to thefollowing rule: r appears before s insort(A) if either of the followinghold:abs(r) < abs(s)abs(r) abs(s) and angle(r) < angle(s)換言之&#xff0c;具有復…

matlab不同調制方式下性能比較,用不同調制方式實現跳/擴頻混合通信的抗干擾性能...

論文寫作指導&#xff1a;請加QQ229366758摘要&#xff1a;介紹了BPSK&#xff0c;QPSK&#xff0c;16PSK&#xff0c;FSK&#xff0c;MSK及GMSK 6種數字調制方式的特點&#xff0c;采用Matlab中的Simulink建立了各種調制方式實現DS/FH混合擴頻系統的仿真模型。重點研究了跳/擴…

matlab cd參數,MATLAB變量參數列表?

默認值default value對于用戶沒有傳遞參數值時給函數進行自動賦給該參數的值?比如上述的例子中&#xff0c;阻尼系數&#xff0c;用戶通常不清楚&#xff0c;可以由系統給出更為合適。怎么做到呢&#xff1f;?可以結合MATLAB的一個函數nargin&#xff0c;它能給出函數輸入參數…

java 旋轉方向,Java 2d方向鼠標點旋轉

使用Graphics2D旋轉方法確實是最簡單的方法.這是一個簡單的實現&#xff1a;int centerX width / 2;int centerY height / 2;double angle Math.atan2(centerY - mouseY, centerX - mouseX) - Math.PI / 2;((Graphics2D)g).rotate(angle, centerX, centerY);g.fillRect(...)…

基于matlab 的燃油噴霧圖像處理方法,基于MATLAB的燃油噴霧圖像處理方法.doc

基于MATLAB的燃油噴霧圖像處理方法基于MATLAB的燃油噴霧圖像處理方法摘要:提出了基于MATLAB的燃油噴霧圖像處理方法。通過對噴霧圖像的采集, 分割和濾波處理, 將多幅圖像轉換融合為一幅比較清楚的二值圖像, 對拍攝的噴霧圖像進行了去噪及二值化等初步處理, 并提取其輪廓圖, 求取…

matlab聲音信號時域頻域轉換,關于處理用采集卡采集到的聲音時域信號轉化成頻域信號........

求助各位大神&#xff0c;我用麥克風通過采集卡采集到了一段聲音數據&#xff0c;數據在附件里&#xff0c;矩陣中第一列為時間&#xff0c;第二列為采集到的聲音的電壓信號&#xff0c;采樣頻率為1萬Hz&#xff0c;做出時域圖和頻域圖的程序如下所示&#xff1a;clear;clc;loa…

win7和mysql亂碼,windows本地mysql數據庫存入中文亂碼

windows本地mysql數據庫存入中文亂碼作者:PHPYuan 時間:2018-07-23 03:41:20出現的問題&#xff1a; 我這頁面存中文到數據庫會亂碼 我打了斷點 中文是傳到后臺dao層的 然后我試了下 把我本地項目連服務器數據庫 保存不會亂碼 我就懷疑是本地數據庫有問題 然后我用navicat寫了個…