2012-10-19 153 views
0

我的雙反斜槓'\'在我的字符串需要被轉換成單反斜槓'\'。我已經嘗試了幾種組合,並且當我使用echo或者更多的反斜槓被偶然添加到字符串時,最終整個字符串消失。此正則表達式的事情是讓我去瘋狂... ...笑PHP preg_replace反斜槓

我想這其中包括失敗的嘗試:

$pattern = '[\\]'; 
$replacement = '/\/'; 

?> 
<td width="100%">&nbsp;<?php echo preg_replace($pattern, $replacement,$q[$i]);?></td> 

我道歉,如果這是一個愚蠢的問題,我很欣賞任何指針。

+0

你的問題有很多錯誤的信息。你想重新考慮使用'stripslashes()'? – Sven

回答

7

使用stripslashes() - 它完全符合您的要求。

<td width="100%">&nbsp;<?php echo stripslashes($q[$i]);?></td> 
+2

'<?= stripslashes($ q [$ i])?>'如果您有短標籤啓用。 ''是速記回聲,對於模板更好 – Ascherer

+0

B-E-A-U-T-I-F-U-L !!! Thanx ... –

+0

stripslashes不僅會將雙反斜槓轉換爲單反斜槓,而且會將所有單反斜槓完全移除(如果它們存在)。這是行爲嗎?這個問題沒有說明這樣的事情。 – Sven

2

改爲使用stripslashes。此外,在你的正則表達式中,你正在尋找單反斜槓,你的替換是不正確的。 \\{2}應搜索雙反斜槓和\應替換單打,雖然我還沒有測試過。

只是爲了進一步解釋,模式[\\]匹配由單個反斜槓組成的集合中的任何字符。在php中,你還應該用正斜槓來劃分你的正則表達式:/[\\]/

你的替換是(沒有分隔符)\,不是用於匹配單個反斜槓的正則表達式。匹配單個反斜槓的正則表達式是\\。注意逃跑。這就是說,替換術語需要是一個字符串,而不是正則表達式(除了反向引用)。

編輯:斯文聲稱下方的stripslashes刪除所有反斜槓。這根本不是真的,我將在下面解釋它的原因。

如果一個字符串包含2個反斜槓,第一個將被視爲轉義反斜槓並將被刪除。這可以在http://www.phpfiddle.org/main/code/3yn-2ut看到。事實上,任何反斜槓本身都與本身矛盾的事實相矛盾,即反斜槓會去除所有反斜槓。

只是爲了澄清,該字符串聲明無效:$x = "\";,因爲反斜槓轉義了第二個引號。該字符串"\\"包含一個反斜槓。在取消引用該字符串的過程中,該反斜線將被刪除。這"\\\\"字符串包含兩個反斜槓。當不加引號時,第一個將被認爲是一個逃避反斜槓,並將被刪除。

+0

關於'stripslashes()'看到我的評論用戶kmkf。關於preg分隔符,你不需要斜槓,任何東西都可以工作。如果斜槓不方便,例如因爲它們在模式中用作普通字符,並且需要進行轉義,所以散列符號「#」,感嘆號「!」等等。 – Sven

+0

@Sven我知道你可以使用其他字符作爲分隔符。否則,我的回答無處不在。我個人的偏好是正斜槓,並且將它們用作分隔符在這裏並不方便,因爲我們不是在處理正斜槓的替換。 –

+0

@Sven此外,你是錯誤的拆除所有反斜槓stripslashes。 stripslashes刪除所有**逃逸**反斜槓。是否啓用魔術引號將會影響反斜槓的數量被視爲轉義反斜槓。 –

0
$pattern = '[\\]'; // wrong 
$pattern = '[\\\\]'; // right 

escape \ as \\ and escape \\ as \\\\因爲\\]表示轉義]。

+0

'[\\\\]'仍然會匹配單個反斜槓,不是嗎?它是正則表達式,它匹配屬於由兩個反斜槓組成的集合的單個字符。 –

+0

每對反斜槓在PHP字符串中只有一個。因此,RegExp中的兩個意思是4.您需要轉義\,因爲它們用於在單引號字符串中轉義'in'。嘗試一下。 – CodeAngry

+0

我明白這一點。也許這[rubular](http://rubular.com/r/sggr4UahNs)會解釋我的意思? –

-2

使用ヶ輛功能賦予您的斜槓轉換爲HTML實體然後使用str_replace函數或的preg_match與新的實體,以改變他們

+0

反斜槓沒有定義html實體。 – Sven

1

不要使用正則表達式,如果你正在尋找的字符串是恆定的,如同「的情況下每個雙反斜槓「。

使用str_replace()執行此任務。這是一個非常簡單的功能,可以用一個字符串替換每個字符串。你的情況:str_replace('\\\\', '\\', $var)

雙反斜槓實際上翻譯爲四個反斜槓,因爲在任何引號(單或雙)內,單個反斜槓是下一個字符的轉義序列的開始。如果你想要一個文字反斜槓,你必須寫兩個。你需要兩個反斜槓,你必須寫四個反斜槓。我不喜歡stripslashes()的建議。這當然會將你的雙反斜槓「解碼」爲一個反斜槓。但它也會刪除整個字符串中的所有單個反斜槓。如果沒有 - 很好,否則現在會失敗。

2

使用的preg_replace把雙反斜槓反斜槓:需要

preg_replace('/\\\\{2}/', '\\', $str) 
  • 在第一個參數的\進行轉義兩次,一次爲string,並再次爲regex,就像CodeAngry說。
  • 在第二個參數中,只有string纔會獲取一次。

有意義嗎?