2012-12-10 36 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

如果你在一个字符串内部转义,你还需要转义转义字符;这真的很让人困惑!

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