則表達式是一種描述字符串結構的語法規則,是一個特定的格式化模式。可以匹配、替換、截取匹配的字符串。
一個完整的正則表達式由兩部分構成,元字符和文本字符。元字符就是具有特殊含義的字符,如“*”,“?”。文本字符就是普通的文本,如字母和數字等。PCRE風格的正則表達式會字定界符“/”的中間。如:/^http:\/\/(www\.)?.+.?$/。下面的例子沒有遵守這個風格。
下面介紹它的語法規則
行定位符就是用來描述字符串的邊界。“^”表示行的開始,“$”表示行的結尾。
如:^stu 表示是匹配字符串是stu開頭的,student,study 就可以被找出來,而tastu,tbstuay就不能匹配了。
stu$ 表示是匹配字符串是stu結尾的,tastu就可以被找出來了。
如果想要匹配的字符串可以出現在字符串的任意位置,那么直接寫stu就可以了。
想匹配字符串出現的任意位置,可以直接使用字符串。像tm可以在 html,utmost中被找出來。但現在如果要匹配單詞tm,而不是單詞的一部分,就可以使用單詞界定符\b表示要查找的字符串為一個完整的單詞。如:\btm\b
\B 的意思是匹配的字符串不能是一個完整的單詞,而是其他單詞或者字符串的一部分。和\b的意思的剛好相反的。
正則表達式是區分大小寫的,如果要忽略大小寫可以使用方括號表達式“[]”。只要匹配的字符串出現在方括號內,即可表示匹配成功。要注意的是,一個方括號只能匹配一個字符。如要匹配字符串tm不區分大小寫,可以寫作:[Tt][Mm]
選擇字符可以理解為或。T|tM|m 意思就是字母T或者t開頭,后面接一個字母M或者m。“[]”和“|”使用區別在于“[]”只能匹配單個字符,而“|”可以匹配任意長度的字符串。
連字符可以表示字符的范圍。比如我們規定一個字符串只能是小寫字母開頭,我們可以寫[a,b,c,d,.....],用連字符就可以之間寫[a-z]
^放進了方括號中,表示的是排除的意思。如:[^a-z] 表示的就是不能以小寫字母開頭
?:匹配前面的字符零次或者一次。如:colou?r,該表達式可以匹配 colour 和 color
+:匹配前面的字符一次或者多次。如:go+gle,該表達式可以匹配的范圍從google到goo...gle
*:匹配前面的字符零次或者多次。如:go*gle,該表達式可以匹配的范圍從ggle到goo...gle
{n}:匹配前面的字符n次。如:go{2}gle,該表達式只匹配google
{n,}:匹配前面的字符最少n次。如:go{n,}gle,該表達式可以匹配的范圍從google到goo..gle
{n,m}:匹配前面的字符最少n次,最多m次。如:employe{0,2},該表達式可以匹配employ,employe和employee這3種情況。
點字符可以匹配出除換行符外的任意一個字符。如匹配s開頭,t結尾,中間包含一個字母的單詞,可以寫作:^s.t$。可以匹配到sat、set、sit等等。匹配一個單詞,它的第一個字母是r,第3個字母是s,最后一個字母是t。那么可以寫作:^r.s.*t$
正則表達式也是用轉義字符將特殊字符(如:“.”,“?”,“\”等等)變為普通的字符。如匹配127.0.0.1的IP地址,可以寫成:[0-9]{1,3}(\.[0-9]{1-3}){3}
這里的點就是通過轉義。
“\”可以做轉義字符外,還能做其他功能。
1、將一些不可打印的字符顯示出來
\a:警報
\b:退格
\e:escape
\f:換頁符
\r:回車符
\t:水平制表符
\xhh:十六進制代碼
\ddd:八進制代碼
\cx:也就是control-x的縮寫,匹配由x指明的控制字符,x是任意字符
2、還可以指定預定義字符集
\d:任意一個十進制數字,相當于[0-9]
\D:任意一個非十進制數字
\s:任意一個空白字符(空格、換行符、換頁符、回車符、水平制表符),相當于[\f\n\r\t]
\S:任意一個非空白字符
\w:任意一個單詞字符,相當于[a-zA-Z0-9]
\W:任意一個非單詞字符
3、定義斷言
\b:單詞界定符,用來匹配字符串中的某些位置。\b是以統一的定界符來匹配。
\B:非單詞定界符序列
\A:總是能夠匹配待搜索文本的起始位置
\Z:表示在未指定任何模式下匹配的字符,通常是字符串的末尾位置,或者是在字符串末尾的換行符之前的位置
\z:只匹配字符串的末尾,而不考慮任何換行符
\G:當前匹配的起始位置
1、可以改變限定符的作用范圍(如:“|”,“*”,“^”等等)。比如:(thir|four)th,這個表達式的意思是可以匹配單詞thirth或者fonrth,如果不用小括號,可以匹配單詞thir和fourth
2、可以分組,也就是子表達式。如:(\.[0-9]{1,3}){3},就是對分組(\.[0-9]{1,3})進行重復操作。
反向引用,就是依靠子表達式的“記憶”功能來匹配連續出現的字串或字母。如匹配連續兩個it,首先將單詞it作為分組,然后后面加上“”即可。格式為:(it)。如果匹配的子串不固定,那么就將括號內的字串寫成一個正則表達式。如果使用了多個分組,那么可以使用“”、“”來表示每個分組(順序是從左到右)。
如:([a-z])([A-Z])
除了可以使用數字來表示分組外,還可以自己來指定分組名稱。
語法格式:(?P<subname>)
如果想要反向引用該分組,使用如下語法:
語法格式:(?P=subname)
重寫表達式([a-z])([A-Z]),為這兩個分組分別命名,并反向引用他們,正則表達式如下:
(?P<fir>[a-z])(?P<sec>[A-Z])(?P=fir)(?P=sec)
模式修飾符的作用就是設定模式。也就是規定正則表達式應該如何解釋和應用。php的主要模式修飾符如下:
修飾符:i 表達式寫法:(?i)...(?-i)、(?i:...)
說明:忽略大小寫模式
修飾符:m 表達式寫法:(?m)...(?-m)、(?m:...)
說明:多文本模式。也就是說字串內部有個換行符時候,影響“^”和“$”的匹配。
修飾符:s 表達式寫法:(?s)...(?-s)、(?s:...)
說明:單文本模式。在此模式下,元字符點號(.)可以匹配換行符。其他模式則不能匹配換行符。
修飾符:x 表達式寫法:(?x)...(?-x)、(?x:...)
說明:忽略空白字符
明天來看看php中一些正則表達式函數。
趣是最好的老師,HelloGitHub 就是幫你找到興趣!
分享 GitHub 上有趣、入門級的開源項目。
這是一個面向編程新手、熱愛編程、對開源社區感興趣 人群的月刊,月刊的內容包括:各種編程語言的項目、讓生活變得更美好的工具、書籍、學習筆記、教程等,這些開源項目大多都是非常容易上手,而且非常 Cool。主要是希望大家能動手用起來,加入到開源社區中。
在瀏覽、參與這些項目的過程中,你將學習到更多編程知識、提高編程技巧、找到編程的樂趣。
最后 HelloGitHub 這個項目就誕生了
以下為本期內容|每個月 28 號發刊
1、ngx_waf:一個 Nginx 防火墻模塊。我差點就錯過了的寶藏項目,它使用簡單不需要復雜的配置,支持的功能直戳我的痛點。你看:
2、fast-cpp-csv-parser:讀取 CSV 文件的 C++ 庫(僅頭文件)。示例代碼:
# include "csv.h"
int main(){
io::CSVReader<3> in("ram.csv");
in.read_header(io::ignore_extra_column, "vendor", "size", "speed");
std::string vendor; int size; double speed;
while(in.read_row(vendor, size, speed)){
// 對 ram.csv 文件中的數據,做你想做的事情吧!
}
}
3、UNO:使用 C++ 編寫的命令行 UNO 紙牌游戲。操作方便支持人機或聯機對戰,游戲基于 Asio 網絡庫和現代 C++ 開發,也有對 C++17 的嘗試。分別實現了服務端、客戶端,代碼簡單對 C++ 新手友好,UNO 的愛好者快來玩一玩吧!
4、godot:一款功能豐富的開源游戲引擎。最初它只是一款 2D 引擎,近期拓展了 3D 部分的能力。相較于 UE4 或者 Unity 這樣的成熟商業引擎來說,Godot 還很年輕不夠成熟,尤其 3D 方面的能力。但它擁有簡易的開發方式,上手簡單。而且社區活躍、文檔覆蓋全面、有較為豐富的示例代碼,對于剛入門的游戲開發者友好。同時開源引擎底層代碼完全開源,開發者可以閱讀和貢獻代碼,而不是只停留在游戲邏輯開發層面。總而言之 Godot 是一個極有潛力的游戲引擎,推薦給想學習游戲開發的同學
5、water.css:一個專門為簡單頁面和示例網頁準備的 CSS 框架
6、fyne:一款 Go 語言跨平臺 UI 庫。想用 Go 寫圖形界面應用的小伙伴,快速上手:
安裝
$ go get fyne.io/fyne
運行一個 demo
$ go get fyne.io/fyne/cmd/fyne_demo/
$ fyne_demo
7、golearn:Go 寫的機器學習框架。來,跑個模型試試吧:
cd $GOPATH/src/github.com/sjwhitworth/golearn/examples/knnclassifier
go run knnclassifier_iris.go
8、keepass2android:一個開源的 Android 密碼管理器。下載地址,功能:
9、PrettyZoo:一款 Java 寫的高顏值 ZooKeeper 客戶端桌面應用。該項目使用了 JDK11 以及 JavaFX 編寫的 GUI 客戶端,代碼量適中適合想學習 JavaFX 編寫應用的朋友。需要連接 ZK 服務端查看數據的話,手邊有這么個工具還是挺方便的。實用和顏值集一身的項目
10、vueblog:一款輕量級 Java 博客項目。基于 SpringBoot+Vue 實現并附有詳細開發文檔和講解視頻,讓剛學會 Java 的同學也能搞定。每個體面的技術人員可能都有一個自己說了算的博客吧
11、x-spreadsheet:基于 JavaScript 實現的輕量級 Web 電子表格庫。它功能齊全,包含表格的基本操作和函數等,還有詳細的中文文檔,在線嘗試
12、h5-Dooring:一款功能齊全的 H5 頁面可視化配置平臺。讓你通過可視化的方式制作出 H5 頁面,技術棧以 React 為主,后臺采用 Node.js 實現。雖然網上有很多這種工具,但本項目免費開源、功能齊全值得一試
13、Ant-Forest:基于 Auto.js 的螞蟻森林能量自動收獲腳本。它是個“綠色環保”的項目,我能從中感受到滿滿的愛和想把它做好的決心!來看看作者開發 Ant-Forest 時解決了哪些難題:
14、tui.image-editor:功能齊全的圖片編輯器。支持圖片剪裁、旋轉、涂鴉等功能,實現了 Vue 和 React 封裝的組件,便于整合進你的項目
15、windows95:基于 Electron 實現的 Windows 95 操作系統。它實現了該操作系統下的所有東西,對!所有!想體驗下 Windows 95 版的掃雷嗎?下載安裝即可
16、LuLu:免費開源的 macOS 防火墻軟件
17、humhub:用 PHP 寫的開源社交平臺。看過《社交網絡》的小伙伴,都知道大名鼎鼎的 Facebook 最早就是扎克伯格用 PHP 語言寫出來的,humhub 能夠讓不會編程的小伙伴也可以用創建出一個社交平臺啦。跟著提示一步步操作,不到 1 分鐘我的社交平臺就建好了
18、phpbrew:一個編譯、安裝、管理多版本 PHP 的工具。有了它就可以方便地在不同 PHP 版本之間自由切換啦,特性:
19、python-patterns:Python 設計模式和使用場景的集合
20、pgcli:支持語法高亮和自動補全的 Postgres 數據庫客戶端命令行工具。它安裝簡單上手快速,如果你用過 Postgres 數據庫自帶的命令行工具,就一定能感受到 pgcli 的迷人之處
21、15-minute-apps:基于 PyQt 框架寫的小型桌面應用程序的集合。想用 Python 寫桌面應用的小伙伴,這個項目應該可以幫到你。比如寫個掃雷游戲:
22、Pine:一個免費、輕量、簡潔的 macOS Markdown 編輯器。功能:
23、Publish:專為 Swift 開發人員準備的靜態網站生成器。讓你實現整個網站都是用 Swift 構建的工具,支持多種主題、插件以及更多強大的自定義選項。示例網站,安裝和快速開始:
$ git clone https://github.com/JohnSundell/Publish.git
$ cd Publish
$ make
$ mkdir MyWebsite
$ cd MyWebsite
$ publish new
24、open-source-rover:NASA 面向科技愛好者開源的火星漫游車設計方案和代碼。通過該項目你可以使用便宜的樹莓派做出自己的火星漫游車,所需的零件很容易就可以買到,遙控部分是使用現成的 Xbox 手柄或者手機,減少花銷。喜歡動手和硬件的小伙伴們,這個東西夠酷嗎?
25、bat:替代 cat 的命令行工具。你還在命令行用 cat 查看文件嗎?那你就 out 啦!今天推薦的 bat 它不僅支持語法高亮,還能展示 Git 的改動。macOS 下安裝命令:brew install bat 相信你用過 bat 后就不會再想用回 cat 了
26、Web-Dev-For-Beginners:微軟開源的 Web 開發教程。該教程共有 24 節課,但目前只有英文版
27、neofetch:展示操作系統信息的命令行工具,支持將近 150 種操作系統
28、jpeg_tutorial:教你編寫 JPEG 解碼器的教程,示例為 Rust 代碼
29、sql-style-guide:一份 SQL 語句編寫風格建議。比如:
-- Good
select *
from users
where email = 'example@domain.com'
-- Bad
select *
from users
where email = "example@domain.com"
30、pure-bash-bible:該書有好多復制就能用的 bash 函數,我愿稱其為 bash 的“奇技淫巧”。比如把字母轉為大寫的函數:
upper() {
# Usage: upper "string"
printf '%s\n' "${1^^}"
}
$ upper "hello"
HELLO
31、pulse:根據包含馬賽克的人臉圖像,生成一張相似容貌的結果。注意不是復原哦,僅可用于人臉
32、Surface-Defect-Detection:該項目整理了目前大量靠譜的表面缺陷檢測數據集,還有最新的頂會論文以及作者的解讀筆記。從事視覺方向的小伙伴,心動了嗎?
迎留言告訴我本期你最喜歡那個項目,如果覺得本文還不錯的話,就點贊、轉發一波吧~
rror
在做php設計以及正則表達式截取字符串時經常遇到亂碼的問題,身邊很多朋友也在問亂碼問題怎么處理。
所以今天就來寫一個亂碼的處理方式。
php輸出數據出現亂碼有很多種,這里呢就針對輸出時出現的亂碼進行處理。
1、先用php來判斷需要輸出的字符串是哪哪種編碼:
mb_detect_encoding($str, array("ASCII",'UTF-8',"GB2312","GBK",'BIG5'));
該方法會返回數組中的編碼的一種,方便大家查看字符串編碼
2、根據字符串的編碼,大家選擇相應的顯示編碼即可
3、如果編碼與輸出頁面的html編碼一致,但是偏偏出現亂碼了,那么也許就是php頁面的問題了,在php頁面頭部加上
header("Content-Type:text/html;charset=utf-8");
上述代碼表示該php頁面輸出以及各種操作均為utf-8編碼方式,當然您也可以設置為其他編碼方式.
如果以上兩步還是解決不了你的亂碼問題,請留言相互探討。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。