搜尋
首頁後端開發php教程PHP preg_replace() 函数修饰符及PHP正则使用详解

PHP 正则表达式

将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“n”匹配字符“n”。“n”匹配一个换行符。序列“”匹配“”而“(”则匹配“(”。
^ 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“n”或“r”之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“n”或“r”之前的位置。
* 匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“do”。?等价于{0,1}。
{n} n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。
{n,} n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。
{n,m} m和n均为非负整数,其中n ? 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o?”将匹配单个“o”,而“o+”将匹配所有“o”。
.点 匹配除“n”之外的任何单个字符。要匹配包括“n”在内的任何字符,请使用像“[sS]”的模式。
(pattern) 匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“(”或“)”。
(?:pattern) 匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。
(?=pattern) 正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern) 正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。
(? (? x|y 匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”。
[xyz] 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。
[^xyz] 负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。
[a-z] 字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。注意:只有连字符在字符组内部时,并且出两个字符之间时,才能表示字符的范围; 如果出字符组的开头,则只能表示连字符本身.
[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。
b 匹配一个单词边界,也就是指单词和空格间的位置。例如,“erb”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。
B 匹配非单词边界。“erB”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。
cx 匹配由x指明的控制字符。例如,cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c”字符。
d 匹配一个数字字符。等价于[0-9]。
D 匹配一个非数字字符。等价于[^0-9]。
f 匹配一个换页符。等价于x0c和cL。
n 匹配一个换行符。等价于x0a和cJ。
r 匹配一个回车符。等价于x0d和cM。
s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ fnrtv]。
S 匹配任何非空白字符。等价于[^ fnrtv]。
t 匹配一个制表符。等价于x09和cI。
v 匹配一个垂直制表符。等价于x0b和cK。
w 匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”。
W 匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。
xn 匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,“x41”匹配“A”。“x041”则等价于“x04&1”。正则表达式中可以使用ASCII编码。
num 匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)1”匹配两个连续的相同字符。
n 标识一个八进制转义值或一个向后引用。如果n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。
nm 标识一个八进制转义值或一个向后引用。如果nm之前至少有nm个获得子表达式,则nm为向后引用。如果nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若n和m均为八进制数字(0-7),则nm将匹配八进制转义值nm。
nml 如果n为八进制数字(0-7),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。
un 匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,u00A9匹配版权符号(©)。

上表是正则表达式比较全面的解释,而商标中的正则字符都有特殊含义,已经不再代表原字符含义。如正则表达式中“+”不代表加号,而是代表匹配一次或多次。而如果想要让“+”表示加号,则需要在其前面加上“”转义,也就是用“+”表示加号。

PHP 正则表达式定界符

大多数语言的正则表达式都是由“/”作为定界符的,而在PHP中,还可以使用“#”定界,如果字符串中包含大量“/”字符,在使用“/”定界的时候,就需要对这些“/”转义,而使用“#”就不需要转义,更简洁。

复制代码代码如下:
 

<?php
$weigeti=&#39;W3CSchool 在线教程的网址是 http://www.scutephp.com/ ,你能把这个网址替换成正确的网址吗?&#39;;
// 上面的要求就是把http://www.scutephp.com/ 替换成 http://www.scutephp.com/w3c/ 
// . : - 都是正则符号,所以需要转义,而 / 是定界符,如果字符串中包含 / 定界符,就需要转义
echo preg_replace(&#39;/http://www.scutephp.com//&#39;,&#39;http://www.scutephp.com/w3c/&#39;,$weigeti);// 在 #作为定界符,/ 就不再是定界符的含义,就不需要转义了。
echo preg_replace(&#39;#http://www.scutephp.com/#&#39;,&#39;http://www.scutephp.com/w3c/&#39;,$weigeti);
//上面两条输出结果都一样,【W3CSchool 在线教程的网址是 http://www.scutephp.com/w3c/ ,你能把这个网址替换成正确的网址吗?】
?>

通过上面的两条PHP 正则替换代码我们可以发现,如果正则语句中包含大量“/”,无论使用“/” 还是 “#”做定界符都是可以的,但是使用“#”能让代码看起来更简洁。但是E维科技建议您还是保持使用“/”作为定界符,因为在Javascript等语言中,只能使用“/”作为定界符,这样写起来可以形成习惯,贯通于其他语言中。

PHP 正则表达式修饰符

修饰符被放在PHP正则表达式定界符“/”尾部,在正则表达式尾部引号之前。

复制代码代码如下:
 

i 忽略大小写,匹配不考虑大小写
m 多行独立匹配,如果字符串不包含[n]等换行符就和普通正则一样。
s 设置正则符号 . 可以匹配换行符[n],如果没有设置,正则符号.不能匹配换行符n。
x 忽略没有转义的空格
e eval() 对匹配后的元素执行函数。
A 前置锚定,约束匹配仅从目标字符串开始搜索
D 锁定$作为结尾,如果没有D,如果字符串包含[n]等换行符,$依旧依旧匹配换行符。如果设置了修饰符m,修饰符D 就会被忽略。
S 对非锚定的匹配进行分析
U 非贪婪,如果在正则字符量词后加&ldquo;?&rdquo;,就可以恢复贪婪
X 打开与perl 不兼容附件
u 强制字符串为UTF-8编码,一般在非UTF-8编码的文档中才需要这个。建议UTF-8环境中不要使用这个

如果您熟悉Javascript 的正则表达式,或许一定熟悉Javascript 正则表达式的修饰符“g”,代表匹配所有符合条件的元素。而在PHP 正则替换中,是匹配所有符号条件的元素,所以不存在Javascript 修饰符“g”。

PHP 正则中文和忽略大小写PHP preg_replace() 是区分大小写的,同时只能匹配ASCII编码内的字符串,如果需要匹配不区分大小写和中文等字符需要添加相应的修饰符 i 或 u。

复制代码代码如下:
 

<?php
$weigeti=&#39;W3CSchool 在线教程网址:http://www.scutephp.com/w3school/&#39;;
echo preg_replace(&#39;/W3CSchool/&#39;,&#39;w3c&#39;,$weigeti);
//大小写不同,输出【w3c 在线教程网址:http://www.scutephp.com/w3school/】
echo preg_replace(&#39;/W3CSchool/i&#39;,&#39;w3c&#39;,$weigeti);
//忽略大小写,执行替换输出【w3c 在线教程网址:http://www.scutephp.com/w3c/】
echo preg_replace(&#39;/网址/u&#39;,&#39;&#39;,$weigeti);
//强制 UTF-8中文,执行替换,输出【W3CSchool 在线教程:http://www.scutephp.com/w3school/】
?>

大小写和中文在PHP中都是敏感的,但是在Javascript正则中,只对大小写敏感,忽略大小写也是通过修饰符 i 作用的,但是Javascript 不需要告知是否是UTF-8中文等特殊字符,直接可以匹配中文。

PHP 正则换行符实例

PHP 正则表达式在遇到换行符时,会将换行符当做字符串中间一个普通字符。而通用符号.不能匹配n,所以遇到带有换行符的字符串正则会有很多要点。

复制代码代码如下:
 

<?php
$weigeti="scutephp.comnISnLOVINGnYOU";

// 想要把上面$weigeti 替换成scutephp.com

echo preg_replace(&#39;/^[A-Z].*[A-Z]$/&#39;,&#39;&#39;,$weigeti);
// 这个正则表达式是,匹配只包含w的元素,$weigeti 是以V开头,符合[A-Z],而且结尾是U,也符合[A-Z]。.无法匹配n
// 输出【jb51.net IS LOVEING YOU】

echo preg_replace(&#39;/^[A-Z].*[A-Z]$/s&#39;,&#39;&#39;,$weigeti);
// 这个用修饰符s,也就是 . 可以匹配 n 了,所以整句匹配,输出空
// 输出【】

echo preg_replace(&#39;/^[A-Z].*[A-Z]$/m&#39;,&#39;&#39;,$weigeti);
// 这里使用了修饰符,将n作为多行独立匹配。也就等价于:
/* 
$preg_m=preg_replace(&#39;/^[A-Z].*[A-Z]$/m&#39;,&#39;&#39;,$weigeti);

$p=&#39;/^[A-Z].*[A-Z]$/&#39;;
$a=preg_replace($p,&#39;&#39;,&#39;
scutephp.com&#39;);
$b=preg_replace($p,&#39;&#39;,&#39;IS&#39;);
$c=preg_replace($p,&#39;&#39;,&#39;LOVING&#39;);
$d=preg_replace($p,&#39;&#39;,&#39;YOU&#39;);

$preg_m === $a.$b.$c.$d;
*/
// 输出【scutephp.com】
?>

以后您在使用PHP 抓取某个网站内容,并用正则批量替换的时候,总无法避免忽略获取的内容包含换行符,所以在使用正则替换的时候一定要注意。

PHP 正则匹配执行函数PHP 正则替换可以使用一个修饰符e,代表 eval() 来执行匹配后的内容某个函数。

复制代码代码如下:
 

<?php
$weigeti=&#39;W3CSchool 在线教程网址:http://www.scutephp.com ,你Jbzj!了吗?&#39;;
// 将上面网址转为小写
echo preg_replace(&#39;/(http:[/w.-]+/)/e&#39;,&#39;strtolower("$1")&#39;,$weigeti);
// 使用修饰符e之后,就可以对匹配的网址执行PHP 函数 strtolower() 了
// 输出 【W3CSchool 在线教程网址:http://www.scutephp.com ,你Jbzj!了吗?】
?>

根据上面代码,尽管匹配后的函数 strtolower() 在引号内,但是依旧会被eval()执行。

正则替换匹配变量向后引用

如果您熟悉Javascript,一定对$1 $2 $3 …… 等向后引用比较熟悉,而在 PHP 中这些也可以被当作向后引用参数。而在PHP中,还可以使用 1 1 来表示向后引用。

向后引用的概念就是匹配一个大片段,这个正则表达式内部又被用括号切割成若干小匹配元素,那么每个匹配元素就被按照小括号序列用向后引用代替。

复制代码代码如下:
 

<?php
$weigeti=&#39;W3CSchool 在线教程网址:http://www.scutephp.com ,你Jbzj!了吗?&#39;;

echo preg_replace(&#39;/.+(http:[w-/.]+/)[^w-!]+([w-!]+).+/&#39;,&#39;$1&#39;,$weigeti);
echo preg_replace(&#39;/.+(http:[w-/.]+/)[^w-!]+([w-!]+).+/&#39;,&#39;1&#39;,$weigeti);
echo preg_replace(&#39;/.+(http:[w-/.]+/)[^w-!]+([w-!]+).+/&#39;,&#39;1&#39;,$weigeti);
// 上面三个都是输出 【http://www.scutephp.com】

echo preg_replace(&#39;/^(.+)网址:(http:[w-/.]+/)[^w-!]+([w-!]+).+$/&#39;,&#39;栏目:$1<br>网址:$2<br>商标:$3&#39;,$weigeti);

// 括号中括号,外面括号先计数
echo preg_replace(&#39;/^((.+)网址:(http:[w-/.]+/)[^w-!]+([w-!]+).+)$/&#39;,&#39;原文:$1<br>栏目:$2<br>网址:$3<br>商标:$4&#39;,$weigeti);
?>

 


陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
使用數據庫存儲會話的優點是什麼?使用數據庫存儲會話的優點是什麼?Apr 24, 2025 am 12:16 AM

使用數據庫存儲會話的主要優勢包括持久性、可擴展性和安全性。 1.持久性:即使服務器重啟,會話數據也能保持不變。 2.可擴展性:適用於分佈式系統,確保會話數據在多服務器間同步。 3.安全性:數據庫提供加密存儲,保護敏感信息。

您如何在PHP中實現自定義會話處理?您如何在PHP中實現自定義會話處理?Apr 24, 2025 am 12:16 AM

在PHP中實現自定義會話處理可以通過實現SessionHandlerInterface接口來完成。具體步驟包括:1)創建實現SessionHandlerInterface的類,如CustomSessionHandler;2)重寫接口中的方法(如open,close,read,write,destroy,gc)來定義會話數據的生命週期和存儲方式;3)在PHP腳本中註冊自定義會話處理器並啟動會話。這樣可以將數據存儲在MySQL、Redis等介質中,提升性能、安全性和可擴展性。

什麼是會話ID?什麼是會話ID?Apr 24, 2025 am 12:13 AM

SessionID是網絡應用程序中用來跟踪用戶會話狀態的機制。 1.它是一個隨機生成的字符串,用於在用戶與服務器之間的多次交互中保持用戶的身份信息。 2.服務器生成並通過cookie或URL參數發送給客戶端,幫助在用戶的多次請求中識別和關聯這些請求。 3.生成通常使用隨機算法保證唯一性和不可預測性。 4.在實際開發中,可以使用內存數據庫如Redis來存儲session數據,提升性能和安全性。

您如何在無狀態環境(例如API)中處理會議?您如何在無狀態環境(例如API)中處理會議?Apr 24, 2025 am 12:12 AM

在無狀態環境如API中管理會話可以通過使用JWT或cookies來實現。 1.JWT適合無狀態和可擴展性,但大數據時體積大。 2.Cookies更傳統且易實現,但需謹慎配置以確保安全性。

您如何防止與會議有關的跨站點腳本(XSS)攻擊?您如何防止與會議有關的跨站點腳本(XSS)攻擊?Apr 23, 2025 am 12:16 AM

要保護應用免受與會話相關的XSS攻擊,需採取以下措施:1.設置HttpOnly和Secure標誌保護會話cookie。 2.對所有用戶輸入進行輸出編碼。 3.實施內容安全策略(CSP)限制腳本來源。通過這些策略,可以有效防護會話相關的XSS攻擊,確保用戶數據安全。

您如何優化PHP會話性能?您如何優化PHP會話性能?Apr 23, 2025 am 12:13 AM

优化PHP会话性能的方法包括:1.延迟会话启动,2.使用数据库存储会话,3.压缩会话数据,4.管理会话生命周期,5.实现会话共享。这些策略能显著提升应用在高并发环境下的效率。

什麼是session.gc_maxlifetime配置設置?什麼是session.gc_maxlifetime配置設置?Apr 23, 2025 am 12:10 AM

theSession.gc_maxlifetimesettinginphpdeterminesthelifespanofsessiondata,setInSeconds.1)它'sconfiguredinphp.iniorviaini_set().2)abalanceisesneededeededeedeedeededto toavoidperformance andunununununexpectedLogOgouts.3)

您如何在PHP中配置會話名?您如何在PHP中配置會話名?Apr 23, 2025 am 12:08 AM

在PHP中,可以使用session_name()函數配置會話名稱。具體步驟如下:1.使用session_name()函數設置會話名稱,例如session_name("my_session")。 2.在設置會話名稱後,調用session_start()啟動會話。配置會話名稱可以避免多應用間的會話數據衝突,並增強安全性,但需注意會話名稱的唯一性、安全性、長度和設置時機。

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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

Safe Exam Browser

Safe Exam Browser

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

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SecLists

SecLists

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