0

所以我是正则表达式的新手,我正在尝试编写一个允许我将撇号 ( ')替换为\'. 当我在http://myregextester.com上测试它时,我想出的正则表达式适用于我的所有测试用例,但是当我在我的代码中实现它时完全出错。

无论如何,这就是我迄今为止所拥有的:

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

它抛出这个错误:

遇到 PHP 错误
严重性:警告
消息: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

任何想法,或指出新手无法发现的明显错误将不胜感激。

4

3 回答 3

2

在字符串内部转义的地方,您还需要转义转义字符;这真的很混乱!

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

于 2012-12-10T17:20:28.947 回答
2

\\)字符串文字中变成\)- 转义的右括号 - 在正则表达式模式中,因为即使在由单引号分隔的字符串文字中,双反斜杠序列也被插入到单个反斜杠中。但问题是,\)正则表达式模式中的序列用于表示文字)符号(否则将被解析为元字符)。

您打算做的最好用\\\\). 这样\\,字符串文字中的每个序列都成为\模式中的一个。模式解析器将看到:

\\)

...一个文字反斜杠符号,后跟)元字符。

但这里似乎还有另一个问题:在您的正则表达式中,您正在寻找一些特殊的(一系列)撇号,但再次用单个撇号替换它们。请记住,\'在字符串文字中就是 - 单引号!您可能打算在'\\\''这里使用。

于 2012-12-10T17:22:25.320 回答
0

我在这里错过了什么吗?为什么不只是这个?

str_replace("'", "\'", $str)
于 2012-12-10T17:20:28.947 回答