2012-01-14 141 views
1

如何檢查字符之前是否存在奇怪或反斜槓? PHP看到單反斜槓和雙反斜槓相同! 請看下面的代碼:單雙反斜槓之間的區別

$str = "\a\\b\\\c"; 
echo preg_replace("/\\\/", "+", $str); // +a+b++c 
echo preg_replace("/\x{005c}/u", "+", $str); // +a+b++c 

echo strlen($str); // 7 
for($i=0; $i<strlen($str); $i++) 
    echo bin2hex($str{$i}).', '; 
// Output: 5c, 61, 5c, 62, 5c, 5c, 63 

我要檢查字符被轉義或不!


如何檢查這兩個字符串之間的差異: 「\一」, 「\\一個」? 像date()函數。

感謝,

回答

1

\a可能是一樣的\\a,但\n肯定是不一樣的\\n。如果下一個字符的反斜線解析爲特殊序列,則反斜線將用作轉義字符。否則,反斜槓只是一個反斜槓。

+0

如何解析它像date()函數?這意味着奇數反斜槓不等於反斜槓? – AHHP 2012-01-14 17:19:32

+0

您需要在字符串文字語法和字符串內容之間進行區分。正如@dgunchev所說,你的字符串是'\ a \ b \\ c',因爲\\是\的一個轉義序列,'\ a','\ b'和'\ c'不是有效的轉義序列。 – Amadan 2012-01-14 17:23:28

1

您的字符串實際上是\a\b\\c - \a是無效的轉義序列因此變得\a,但是嘗試\n,這是有效的,看到的差異。

+0

其實我想模擬反斜槓轉義。請考慮重寫date()函數。所以我需要解析一個字符串,並以奇怪和反斜槓的方式做不同的事情。 – AHHP 2012-01-14 17:48:32

+0

不確定我在這裏找到你,但爲了使事情更簡單,嘗試從文本文件中讀取輸入(逐行說),而不是將其嵌入到代碼中。當你嵌入它時,PHP解釋器首先處理反斜槓。或者試試: '$ BSL = 「\\」;'' $海峽= $ BSL 「一個」 $ BSL $ BSL 「B」 $ BSL $ BSL $ BSL 「C」;。。。。。。 ' ... – 2012-01-18 23:18:01

1

簡短的回答是,你不能用正則表達式。你不能做可變長度的後置斷言,以保證這一點。我設法編寫了一個正則表達式,它在查找這樣的字符串方面做得非常好,甚至可以使用一次子模式進行優化,但偶爾會導致緩衝區溢出並在發生大量匹配時崩潰腳本。

看看strcspn()。這對編寫自定義解析函數非常有用。您可以使用\作爲停止字符。然後與下一個角色一起行動,如果它是特殊的,或者如果不是,則跳到前面。它也比正則表達式運行得更快。

相關問題