1. 程式人生 > >PHP中4個反斜槓的問題 正則匹配 3個反斜槓的情況

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有點奇怪,如果五個反斜槓報錯是正常的情況,那麼三個反斜槓報錯應該就是反常的情況了,那為啥三個反斜槓就不會報錯,而且正常匹配出來了呢???

目前還沒想到為啥會出現這種情況,不知道有沒有哪個大神願意給小生講一下

每天進步一小點,不斷積累——致自己