正则表达式在偏移量50处替换撇号(') - 编译失败:丢失)

时间:2012-12-10 17:13:48

标签: php regex

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

无论如何,这就是我现在所拥有的:

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

并抛出此错误:

  

遇到PHP错误   严重性:警告
  消息:preg_replace()[function.preg-replace]:编译失败:丢失)偏移50

我已经计算了二十次才能看到)不匹配的地方,而我的眼睛则没有。这是我的几个方面之一:

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

任何想法,或指出新手无法发现的明显错误都会非常感激。

3 个答案:

答案 0 :(得分:2)

如果你在一个字符串中逃脱,你还需要逃避逃脱的角色;这真让人困惑!

如果您需要\,则需要执行\\\\

答案 1 :(得分:2)

字符串文字中的

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

您打算做的最好用\\\\)编写。这样,字符串文字中的每个\\序列在模式中变为单个\。模式解析器将看到:

\\)

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

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

答案 2 :(得分:0)

我在这里遗漏了什么吗?为什么不呢?

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