搜尋
首頁php教程php手册PHP学习笔记之POSIX正则表达式

PHP学习笔记之POSIX正则表达式

1 基础知识

正则表达式是一种描述一段文本模式的方法。到目前为止,我们前面所用到过的精确文字)匹配也是一种正则表达式。例如,前面我们曾搜索过正则表达式的术语,像"shop"和"delivery"。

在PHP中,匹配正则表达式更有点像strstr()匹配,而不像相等比较,因为是在一个字符串的某个位置如果不指明则可能在字符串中的任何位置)匹配另一个字符串。例如,字符串"shop"匹配正则表达式"shop"。它也可以匹配正则表达式"h"、"ho",等。

除了精确匹配字符外,还可以用特殊字符来指定表达式的元意meta-meaning)。例如,使用特殊字 符,可以指定一个在字符串开始或末尾肯定存在的模式,该模式的某部分可能被重复,或模式中的字符属于特定的某一类型。此外,还可以按特殊字符的出现来匹 配。接下来,我们将逐个讨论这些变化。

2 字符集和类

使用字符集可以马上给出比精确匹配功能还要强大的正则表达式。字符集可以用于匹配属于特定类型的任何字符;事实上它们是一种通配符。

首先,可以用字符作为一个通配符来代替除换行符\n)之外的任一个字符。例如,正则表达式:


.at


可以与"cat"、"sat"和"mat"等进行匹配。通常,这种通配符匹配用于操作系统中的文件名匹配。

但是,使用正则表达式,可以更具体地指明希望匹配的字符类型,而且可以指明字符所属的一个集合。在前面的例子中,正则表达式匹配"cat"和"mat",但也可以匹配"#at"。如果要限定它是a到z之间的字符,就可以像下面这样指明:


[a-z]at

任何包含在方括号[])中的内容都是一个字符类——一个被匹配字符所属的字符集合。请注意,方括号中的表达式只匹配一个字符。

我们可以列出一个集合,例如:


[aeiou]


可以用来表示元音子母。

也可以描述一个范围,正如前面用连字符那样,也可以是一个范围集:


[a-zA-Z]


这个范围集代表任何的大小写字母。

此外,还可以用集合来指明字符不属于某个集。例如:


[^a-z]


可以用来匹配任何不在a和z之间的字符。当把脱字符号^)包括在方括号里面时,表示否。当该符号用在方括号的外面,则表示另外一个意思,我们稍后将详细介绍。

3 重复

通常,读者会希望指明某个字符串或字符类将不止一次地出现。可以在正则表达式中使用两个特殊字符代替。符号“*”表示这个模式可以被重复0次或更多次,符号“+”则表示这个模式可以被重复1次或更多次。这两个符号应该放在要作用的表达式的后面。

例如:


[[:alnum:]]+


表示“至少有一个字母字符”。

4 子表达式

通常,将一个表达式分隔为几个子表达式是非常有用的,例如,可以表示“至少这些字符串中的一个需要精确匹配”。可以使用圆括号来实现,与在数学表达式中的方法一样。

例如:


(very)*large


可以匹配"large"、"very large"、"very very large"等。

5 子表达式计数

可以用在花括号{})中的数字表达式来指定内容允许重复的次数。可以指定一个确切的重复次数{3}表示重复3次),或者一个重复次数的范围{2,4}表示重复2~4次),或是一个开底域的重复范围{2,}表示至少要重复两次)。

例如:


(very){1,3}


表示匹配"very"、"very very"和"very very very"。

6 定位到字符串的开始或末尾

[a-z]模式将匹配任何包含了小写字母字符的字符串。无论该字符串只有一个字符,或者在整个更长的字符串中只包含一个匹配的字符,都没有关系。

也可以确定一个特定的子表达式是否出现在开始、末尾或在两个位置都出现。当要确定字符串中只有要找的单词而没有其他单词出现时,它将相当有用。

脱字符号^)用于正则表达式的开始,表示子字符串必须出现在被搜索字符串的开始处,字符“$”用于正则表达式的末尾,表示子字符串必须出现在字符串的末尾。

例如,以下是在字符串开始处匹配bob:


^bob


这个模式将匹配com出现在字符串末尾处的字符串:


com$


最后,这个模式将匹配只包含a到z之间一个字符的字符串:


^[a-z]$


7 分支

可以使用正则表达式中的一条竖线来表示一个选择。例如,如果要匹配com、edu或net,就可以使用如下所示的表达式:


com|edu|net


8 匹配特殊字符

如果要匹配本节前面提到过的特殊字符,例如,.、{或者$,就必须在它们前面加一个反斜杠\)。如果要匹配一个反斜杠,则必须用两个反斜杠\\)来表示。

在PHP中,必须将正则表达式模式包括在一个单引号字符串中。使用双引号引用的正则表达式将带来一些不必要的复杂性。PHP还使用反斜杠来转义特殊字符——例如反斜杠。

如果希望在模式中匹配一个反斜杠,必须使用两个反斜杠来表示它是一个反斜杠字符,而不是一个转义字符。

同样,由于相同的原因,如果希望在一个双引号引用的PHP字符串中使用反斜杠字符,必须使用两个反斜杠。这可 能会有些混淆,这样要求的结果将是表示一个包含了反斜杠字符的正则表达式的一个PHP字符串需要4个反斜杠。PHP解释器将这4个反斜杠解释成2个。然 后,由正则表达式解释器解析为一个。

$符号也是双引号引用的PHP字符串和正则表达式的特殊字符。要使一个$字符能够在模式中匹配,必须使用“\\\$”。因为这个字符串被引用在双引号中,PHP解释器将其解析为\$,而正则表达式解释器将其解析成一个$字符。

9 在智能表单中应用

在智能表单应用程序中,正则表达式至少有两种用途。第一种用途是在顾客的反馈中查找特定的名词。使用正则表达 式,可以做得更智能一些。使用一个字符串函数,如果希望匹配"shop"、"customer service"或"retail",就必须做3次不同的搜索。如果使用一个正则表达式,就可以同时匹配所有3个,如下所示:


shop|customer service|retail


第二个用途是验证程序中用户的电子邮件地址,这需要通过用正则表达式来对电子邮件地址的标准格式进行编码。这 个格式中包含一些数字或标点符号,接着是符号“@”,然后是包括文字或数字和字符组成的字符串,后面接着是一个“.”点号),后面包括文字或数字以连字 符组成的字符串,可能还有更多的点号,直到字符串结束,它的编码如下所示:


^[a-zA-Z0-9_\-.]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-.]+$


子表达式^[a-zA-Z0-9_\-.]+表示“至少由一个字母、数字、下画线、连字符、点号或者这些字符组合为开始的字符串”。请注意,当在一个字符类的开始或末尾处使用点号时,点号将失去其特殊通配符的意义,只能成为一个点号字符。

符号“@”匹配字符“@”。

而子表达式[a-zA-Z0-9\-]+与包含文字数字字符和连字符的主机名匹配。请注意,我们去除了连字符,因为它是方括号内的特殊字符。

字符组合“\.”匹配“.”字符。我们在字符类外部使用点号,因此必须对其转义,使其能够匹配一个点号字符。

子表达式[a-zA-Z0-9\-\.]+$匹配域名的剩下部分,它包含字母、数字和连字符,如果需要还可包含更多的点号直到字符串的末尾。

不难发现,有时一个无效的电子邮件地址也会符合这个正则表达式。找到所有无效电子邮件几乎是不可能的,但是经 过分析,情形将会有所改善。可以按许多不同的方式精化这个表达式。例如,可以列出所有有效的顶级域TLD)。当对某些对象进行限制的时候,请千万小心, 因为可能排斥1%的有效数据的校验函数比允许出现10%的无效数据的校验函数还要麻烦。

“每个星期读一本书,那么一年就读了50本书” 加油。。。 别给自己太多放弃的理由。



陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php怎么判断有没有小数点php怎么判断有没有小数点Apr 20, 2022 pm 08:12 PM

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么设置implode没有分隔符php怎么设置implode没有分隔符Apr 18, 2022 pm 05:39 PM

在PHP中,可以利用implode()函数的第一个参数来设置没有分隔符,该函数的第一个参数用于规定数组元素之间放置的内容,默认是空字符串,也可将第一个参数设置为空,语法为“implode(数组)”或者“implode("",数组)”。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),