2012-12-10 44 views
0

所以我是新來的正則表達式,我試圖寫一個將允許我用\'替換撇號(')。當我在http://myregextester.com上測試它時,我想出的正則表達式與我所有的測試用例一起工作,但在我的代碼中實現它時完全錯誤。正則表達式替換撇號(') - 編譯失敗:缺失)在偏移量50

不管怎麼說,這是我作爲尚未:

preg_replace('/((?<!\\)\'+(?=\d\ds\b))|(\b(?<=\w)(?<!\\)\'+(?=\w+\b))/','\'',$text); 

,並拋出這個錯誤:

A PHP Error was encountered
Severity: Warning
Message: preg_replace() [function.preg-replace]: Compilation failed: missing) at offset 50

我也算如二十次,看看那裏的)不匹配起來,而我眼中沒有。這裏是我的幾大罪狀之一:

((?<!\\)'+ (?=\d\ds\b)) | (\b (?<=\w) (?<!\\) '+ (?=\w+\b) ) 
1 2  3 4   5 6 7 8  9 10  11 12  13 14 

任何意見,或指出我昭然若揭失誤新手不能當場將不勝感激。

+1

你是否回顯了字符串以查看實際傳遞給'preg_replace'的內容? – melpomene

+0

我剛剛加倍檢查,我期望的文本已通過。爲了測試的緣故,沿着$ text =「'80s'90s行的東西不會不會'30'我''; – letsgettechnical

+0

不是正文,正則表達式! – melpomene

回答

1

\\)字符串字面變得\) - 逃脫右括號 - 在正則表達式模式,如雙反斜線序列內插到單反斜線甚至在由單引號分隔的字符串中。問題是,正則表達式中的\)序列用於表示文字)符號(否則它將被解析爲元字符)。

你打算做什麼可能是最好用\\\\)寫。通過這種方式,字符串中的每個\\序列都變爲模式中的單個\。該模式解析器會看到:

\\)

...反斜線符號,其次是)元字符。

但它似乎是這裏有一個問題:在您的正則表達式你撇號尋找一些特殊的(一系列),再次用單引號替換它們。請記住,\'內的字符串文字就是這樣 - 單引號!您可能打算在這裏使用'\\\''

+0

因此,當我這樣做時,它不會出錯,但它也不會添加\。所以'$ text =''80年代90年代不是'30年代我'「; \t $ text = preg_replace('/((?<!\\\\))+(?= \ d \ ds \ b))|(\ b(?<= \ w)(?<!\\ \\)\ '?+(= \ W + \ b))的/', '\'」,$文本); echo $ text;'測試仍然沒有改變。 – letsgettechnical

+0

我在這裏有點困惑:如果您希望在這裏尋找單個apostroph並將其替換爲單個apostroph,您如何期望$ text被更改?你不應該使用''''作爲替換文本嗎? – raina77ow

+0

啊哈!謝謝,我不知道所有的「必須」都必須應用於替換。我會標記你的答案是正確的。 – letsgettechnical

0

我在這裏錯過了什麼嗎?爲什麼不是這個?

str_replace("'", "\'", $str) 
+0

看看正則表達式,我會說這個問題沒有完全描述他們試圖解決的問題。 :) –

+0

對不起,我不希望它改變單引號,只有撇號(所以不要或80年代vs'我引用了這裏的東西')。我在稍後顯示文本時對撇號添加了一個轉義 – letsgettechnical

2

如果你在一個字符串內部轉義,你還需要轉義轉義字符;這真的很讓人困惑!

如果你想有一個\你需要做\\\\