PHP中4個反斜槓的問題 正則匹配 3個反斜槓的情況
背景:
今天在學習正則表示式,遇到了一個問題,php中4個反斜槓\在不同直譯器中的結果。
正文:
我們先來看看以下程式碼
echo '\';
執行之後報語法錯誤,提示unexpected'\'; ',即\'; 這幾個字元出了問題
Parse error: syntax error, unexpected ''\'; ' (T_ENCAPSED_AND_WHITESPACE) in D:\phpStudy\PHPTutorial\WWW\phpStudy\12_4backslash\1.php on line 10
我的理解是,php直譯器在讀程式碼的時候,發現了第一個反斜槓,會連同後面的';也一起解釋成轉義字元,因此少了代表結尾的'以及;
報這個錯也理所當然。
接著我們改成以下程式碼
echo '\\';
執行之後成功輸出一個\
\
接著繼續改動我們的程式碼
echo '\\\';
報錯,原因同第一個錯
Parse error: syntax error, unexpected ''\\\'; ' (T_ENCAPSED_AND_WHITESPACE) in D:\phpStudy\PHPTutorial\WWW\phpStudy\12_4backslash\1.php on line 10
接下來繼續改動
echo '\\\\';
執行之後
\\
經過上面的測試,可能跟你想的一樣,如果要讓php直譯器解釋出一個反斜槓,就需要使用\\;如果需要php直譯器解釋成兩個反斜槓,則使用\\\\
下面來討論一下正則直譯器的情況。
正常情況下,如果我們要用正則來匹配是否有反斜槓,會這麼寫
$content = 'Aha! Can you type backslash characters? Yeah! Here is a \ ';
$pattern = '/\\/';
$result = preg_match($pattern,$content);
echo $result;
但結果是
Warning: preg_match(): No ending delimiter '/' found in D:\phpStudy\PHPTutorial\WWW\phpStudy\12_4backslash\1.php on line 13
很明顯報錯了,原因很簡單,php直譯器在看到$pattern的時候,會把$pattern解釋成/\/,然而preg_match中的第一個引數需要有一對任何非字母、數字、“\”或空格的字元作為分隔符,也就是我們最常用的“/”,所以php報了一個沒有結束分隔符的錯。
程式碼改進
$content = 'Aha! Can you type backslash characters? Yeah! Here is a \ ';
$pattern = '/\\\\/';
$result = preg_match($pattern,$content);
echo $result;
將兩個反斜槓變成四個反斜槓,$pattern被php解釋為/\\/,再由正則直譯器解釋為\,即匹配一個\
輸出$result
1
總結:
如果要讓正則匹配出一個\字元,則需要在php中的pattern中新增四個\字元,經過php直譯器解釋成兩個\字元,再有正則直譯器解釋成一個字元\
PS:
遇到了一個比較反常的情況,大家感興趣的可以一起討論一下,也可以選擇跳過
如果程式碼變成一個反斜槓的情況
$content = 'Aha! Can you type backslash characters? Yeah! Here is a \ ';
$pattern = '/\/';
$result = preg_match($pattern,$content);
echo $result;
意料之中的報錯了
Warning: preg_match(): No ending delimiter '/' found in D:\phpStudy\PHPTutorial\WWW\phpStudy\12_4backslash\1.php on line 13
沒有結尾分隔符,原因上文中有
繼續改,變成三個反斜槓
$content = 'Aha! Can you type backslash characters? Yeah! Here is a \ ';
$pattern = '/\\\/';
$result = preg_match($pattern,$content);
echo $result;
結果為1,沒有報錯
1
echo 一下$pattern,結果如下
/\\/
也就是說,三個反斜槓的情況,php成功解釋成兩個反斜槓的情況,而且正則也成功匹配出了一個反斜槓
繼續改,變成五個反斜槓
$content = 'Aha! Can you type backslash characters? Yeah! Here is a \ ';
$pattern = '/\\\\\/';
$result = preg_match($pattern,$content);
echo $result;
報錯了
Warning: preg_match(): No ending delimiter '/' found in D:\phpStudy\PHPTutorial\WWW\phpStudy\12_4backslash\1.php on line 13
沒有結束分隔符的錯誤
emmmmm有點奇怪,如果五個反斜槓報錯是正常的情況,那麼三個反斜槓報錯應該就是反常的情況了,那為啥三個反斜槓就不會報錯,而且正常匹配出來了呢???
目前還沒想到為啥會出現這種情況,不知道有沒有哪個大神願意給小生講一下
每天進步一小點,不斷積累——致自己