1.單引號字符串只轉義\'和\\,而雙引號都轉義且替換php變量;運行php
<?php
$a = 'hello\\\p';
echo $a ."<br />";
$b = "hello\\\p";
echo $b ."<br />";
$a = 'hello\\p';
echo $a ."<br />";
$b = "hello\\p";
echo $b ."<br />";ide
結果爲spa
hello\\p
hello\\p
hello\p
hello\p字符串
此時你會發現不管是單引號仍是雙引號字符串,在對待\\上都是同樣的,只處理一次\\並將其轉爲\,若是隻剩下一個\那麼只要不和後面字符產生轉義則都不轉義直接看成一個字符\;看看string
<?php
$a = 'hello\\\n';
echo $a ."<br />";
$b = "hello\\\n";
echo $b ."<br />";it
結果爲class
hello\\n
hello\ 變量
2.正則對特殊字符都須要轉義,運行原理
<?php
$a = 'abc\\\$';
$b = "abc\\\$";
echo $a . ":" . $b . "<br />";
preg_match('/\\\\/',$a,$match);
var_dump($match);//匹配字符\
preg_match('/\\\\/',$b,$match);
var_dump($match);//匹配字符\
preg_match("/\\\\/",$a,$match);
var_dump($match);//匹配字符\
preg_match("/\\\\/",$b,$match);
var_dump($match);//匹配字符\
echo "<br />";
preg_match('/\\$/',$a,$match);
var_dump($match);//匹配字符$
preg_match('/\\$/',$b,$match);
var_dump($match);//匹配字符$
preg_match("/\\\$/",$a,$match);
var_dump($match);//匹配字符$
preg_match("/\\\$/",$b,$match);
var_dump($match);//匹配字符$
echo "<br />";
preg_match('/\\\\\$/',$a,$match);
var_dump($match);//匹配字符\$
preg_match('/\\\\\$/',$b,$match);
var_dump($match);//匹配字符\$
preg_match("/\\\\\\\$/",$a,$match);
var_dump($match);//匹配字符$
preg_match("/\\\\\\\$/",$b,$match);
var_dump($match);//匹配字符$
?>di
結果爲
abc\\$:abc\$
array(1) { [0]=> string(1) "\" }
array(1) { [0]=> string(1) "\" }
array(1) { [0]=> string(1) "\" }
array(1) { [0]=> string(1) "\" }
array(1) { [0]=> string(1) "$" }
array(1) { [0]=> string(1) "$" }
array(1) { [0]=> string(1) "$" }
array(1) { [0]=> string(1) "$" }
array(1) { [0]=> string(2) "\$" }
array(1) { [0]=> string(2) "\$" }
array(1) { [0]=> string(2) "\$" }
array(1) { [0]=> string(2) "\$" }
分析:preg_match第一個參數爲正則匹配模式,先按單引號字符串或雙引號字符串轉義,而後對結果再按正則轉義一次,結果就比較好理解了,如'/\\\\\$/'被字符串轉義後爲'\\\$',再被正則轉義爲'\$';如"/\\\\\\\$/"被字符串轉義後爲'\\\$',再被正則轉義爲'\$'.
小結:勤加練習,找出原理纔是解決問題的根本!