preg_quote()逃脫了正則特殊字符,包括後斜切和定界符,將它們視為文字; 2。通過傳遞原始字符串(例如'c:\ path')而沒有預(yù)淘汰的後斜線來避免雙重掃描; 3。在可能的情況下,在路徑中使用前向斜線以減少後拔雜亂的混亂; 4。始終將正則定界符作為preg_quote()的第二個(gè)參數(shù),以確保其正確逃脫; 5。僅將preg_quote()應(yīng)用於模式的動(dòng)態(tài)或用戶提供的部分,而不將整個(gè)正則表達(dá)式應(yīng)用; 6。切勿在包含有意的metacharacter的完整圖案上使用preg_quote(),例如 ^或。 *; 7。通過使用var_dump()輸出最終模式來驗(yàn)證正確性來調(diào)試。 preg_quote()是一種可以安全地將字符串嵌入到正則的工具,而不是逃脫整個(gè)模式,並且當(dāng)在文字和正則邏輯之間的邊界之間存在界限時(shí),它的正確使用會(huì)防止後斜線混淆。
對(duì)於許多開發(fā)人員來說,在PHP Regex中處理後斜線是一段儀式。您寫一個(gè)圖案,測(cè)試它,突然間您淹沒在\\
, \\\\
,或更糟糕的是 - 您的正則有時(shí)會(huì)起作用,並且神秘地失敗了。這不僅令人困惑,而且是後衛(wèi)地獄。雖然通常將preg_quote()
作為解決方案呈現(xiàn),但使用它正確地需要了解它實(shí)際上的工作以及它沒有的方法。

讓我們減少噪音。
preg_quote()
實(shí)際做什麼
preg_quote()
是一個(gè)簡(jiǎn)單但通常被誤解的功能。它的工作很簡(jiǎn)單:

它逃脫了在正則模式中具有特殊含義的字符,因此將其視為字面角色。
這是它逃脫的字符列表(在PCRE的上下文中):

``。 ^\ $ |()[] {}*? /
是的 - 它也逃脫了後斜線本身,因?yàn)樵谡齽t``\''是逃生角色。 因此,如果您致電: ````PHP preg_quote('c:\ path \ to \ file.txt','/');
你得到:
c:\\ path \\ to \\ file \ .txt
注意:
- 每個(gè)
\
變?yōu)?code>\\ (因?yàn)锽ackSlash在Regex中很特別) - 這
.
變成\.
(因?yàn)?code>.
第二個(gè)參數(shù)是定界符-Commonly /
, #
或~
。 preg_quote()
確保如果定界符出現(xiàn)在字符串中,也可以逃脫。
例如:
preg_quote('find/home/用戶','/');
返回:
查找\/home \/用戶
因此,當(dāng)您將文字字符串注入正則弦模式時(shí)preg_quote()
至關(guān)重要。
開發(fā)人員被絆倒的地方
混亂通常開始時(shí),當(dāng)文件路徑,URL或用戶輸入輸入正則世界時(shí)。
1。雙重逃避後斜線
您可以嘗試通過預(yù)淘汰後斜切來“幫助” PHP:
$ path ='c:\\ path \\ to \\ file.txt'; preg_quote($ path,'/');
現(xiàn)在,您正在餵食preg_quote()
一個(gè)已經(jīng)逃脫後斜線的字符串。結(jié)果? C:\\\\path\\\\to\\\\file\\.txt
這可能不是您想要的。
?修復(fù):傳遞原始字符串:
$ path ='c:\ path \ to \ file.txt'; //單個(gè)後擋 preg_quote($ path,'/');
或者更好,請(qǐng)使用前向斜線(在大多數(shù)PHP上下文中在Windows上完全有效):
$ path ='c:/path/to/file.txt';
現(xiàn)在, preg_quote()
除非您的定界符為/
,否則不會(huì)觸摸斜杠,在這種情況下,只有/
被逃脫。
2。在模式的中間使用preg_quote()
您並不總是想引用整個(gè)模式 - 只是其中的一部分。
示例:您想匹配基本路徑,然後是任何文件名。
$ basepath ='c:\ users \ john'; $模式='/^'。 preg_quote($ basepath,'/')。 '\\\\。 *\\。 txt $/';
這構(gòu)建:
/^c:\ \ users \ john \ \ \ \ \ \ \ txt$/
?正確:僅引用動(dòng)態(tài)部分。將正則錨點(diǎn)( ^
, $
)和自定義邏輯( .*\.txt
)手動(dòng)添加。
3。忘記定界符
如果您忘記將定界符傳遞給preg_quote()
,它不會(huì)逃脫:
preg_quote('find /home /user'); //定界符默認(rèn)為null
返回: Find /home/user
- /
未逃脫。
但是,如果您以後使用/
用作正則分界符:
'/^'。 preg_quote('find /home /用戶')。 '$/'
您會(huì)得到: /^Find /home/user$/
- 由於uneScaped /
the the ture。
?始終將您的正則定界符傳遞給preg_quote()
:
preg_quote('find/home/用戶','/')
當(dāng)不使用preg_quote()
preg_quote()
用於字面字符串。如果您要使用有意的Metacharacters構(gòu)建完整的正則圖案,請(qǐng)不要將整個(gè)內(nèi)容包裹在preg_quote()
中。
?錯(cuò)誤:
preg_quote('^Hello。*world $','/');
現(xiàn)在,您要匹配字面字符串^Hello.*world$
,不使用正則邏輯。
?右:僅引用應(yīng)該是字面意思的部分:
$ prefix ='Hello(World)'; $模式='/^'。 preg_quote($ prefix,'/')。 '。 *$/';
避免後斜線地獄的實(shí)用技巧
- 盡可能在路徑中使用前向斜線。 PHP在窗戶上可以很好地處理它們。
- 始終將定界符傳遞到
preg_quote()
。 - 切勿在輸入字符串中預(yù)淘汰後斜切。
- 僅引用用戶提供或動(dòng)態(tài)字符串,而不是整個(gè)模式。
- 使用
var_dump()
或echo
在使用之前檢查最終模式。
示例調(diào)試:
$ term ='example.com(v1)'; $模式='/^'。 preg_quote($ term,'/')。 '\ .exe $/'; var_dump($模式); //檢查您實(shí)際匹配的內(nèi)容
後斜線不是不可避免的。通常是您要混合原始字符串,逃脫的字符串和正則邏輯,而沒有明確的邊界。 preg_quote()
不是魔術(shù),但是正確使用的是您需要的救生筏。
請(qǐng)記?。阂梦淖?,而不是邏輯。也許切換到前斜線。您的理智會(huì)感謝您。
以上是導(dǎo)航後衛(wèi)地獄:深入研究`preg_quote()`and Regex逃脫的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

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

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)

preg_quote()escapesregex-specialcharacters,includingbackslashesandthedelimiter,totreatthemasliterals;2.avoiddouble-escapingbypassingrawstrings(e.g.,'C:\path')withoutpre-escapedbackslashes;3.useforwardslashesinpathswhenpossibletoreducebackslashclutter

Heredoc處理變量插值和基本轉(zhuǎn)義序列如\n、\t、\\、\$,但不處理\"或\',而Nowdoc不進(jìn)行變量插值和任何轉(zhuǎn)義處理,所有內(nèi)容包括\n和變量均按字面輸出;1.Heredoc中變量如$name會(huì)被替換,\\n被解析為換行;2.Nowdoc中$name和\n均保持原樣;3.兩者都不需要轉(zhuǎn)義引號(hào);4.結(jié)束標(biāo)識(shí)符必須獨(dú)占一行且無前導(dǎo)空格,PHP7.3 允許使用空格縮進(jìn)結(jié)束標(biāo)識(shí)符。因此Heredoc適用於需格式化的多行字符串,Nowdoc適合輸出原始內(nèi)容如SQL或JavaScript

始終escapeOutputingContext-SpecificMethods:htmlspecialchars()forhtmlContentAntAttributes,rawurlencode()forurls,andjson_en code()withjson_hex_tag,json_hex_apos,json_hex_quot,andjson_unescaped_unicodeodeforjavascript.2.usetemplatingenginesliketwig,lara

inbash,單quotestareatallacharacterslitellywhiledbouldequotesallaibal -expansionandlimitedescaping; inpythonandjavascript,bothequotetypespeshandleescapestamisame,witheChoIceMainallyablectringingingablectringingablectingabilitingabilitingabilityabilityance and Concencenience and conconvenienceWhenembednembeddingdingdingdingdingdingdingdingdingdingdoquote,souseseSingLelequote

TomasterbackslashesinPHPregex,understandthattwolayersofparsingoccur:PHPprocessesescapesequencesfirst,thentheregexenginedoes;2.UsesinglequotesforregexpatternstoavoidPHPinterpretingescapeslike\basbackspace;3.Indoublequotes,doublethebackslashes(e.g.,&qu

addslashes()應(yīng)避免用於SQL轉(zhuǎn)義,因?yàn)樗话踩也环繱QL注入;htmlspecialchars()用於HTML輸出以防止XSS攻擊;mysqli_real_escape_string()可用於MySQL查詢中的字符串轉(zhuǎn)義,但僅在無法使用預(yù)處理語句時(shí)作為次優(yōu)選擇。 1.addslashes()是過時(shí)且不安全的,不應(yīng)在現(xiàn)代應(yīng)用中用於SQL轉(zhuǎn)義;2.htmlspecialchars()應(yīng)在將用戶輸入輸出到HTML時(shí)使用,以防止XSS;3.mysqli_real_escape_string(

SQL注入防護(hù)不能依賴addslashes(),因其不處理多字節(jié)編碼且僅轉(zhuǎn)義有限字符,易被繞過;應(yīng)使用預(yù)處理語句(如PDO或MySQLi的參數(shù)化查詢)將數(shù)據(jù)與SQL邏輯分離,確保輸入不被解析為代碼;若無法使用預(yù)處理,需根據(jù)上下文采用數(shù)據(jù)庫(kù)特定的轉(zhuǎn)義函數(shù)(如real_escape_string並設(shè)置正確字符集)、標(biāo)識(shí)符白名單或引號(hào)包裹、整型輸入強(qiáng)制類型轉(zhuǎn)換等方法,實(shí)現(xiàn)分層防禦。

sotofixthis:1.sissinglequotequotesforliteralathslike'c:\ users \ users \ john \ documents',2.DoublethebackSlashEsIndBookSindoublequotquoteSess'c:c:c:c:
