PHP使用preg_replace:"分隔符不能是字母数字或反斜杠"错误

Chr*_*her 33 php regex preg-replace

我试图采取一串文字,如下所示:

$string = "This (1) is (2) my (3) example (4) text";
Run Code Online (Sandbox Code Playgroud)

在括号内有正整数的每个实例中,我想用简单的整数本身替换它.

我现在使用的代码是:

$result = preg_replace("\((\d+)\)", "$0", $string);
Run Code Online (Sandbox Code Playgroud)

但我一直在接受

分隔符不得为字母数字或反斜杠.

警告

有什么想法吗?我知道这里有其他问题可以解答这个问题,但我对正则表达式的了解并不足以将其转换为这个例子.

cod*_*ict 44

你快到了.您正在使用:

$result = preg_replace("((\d+))", "$0", $string);
Run Code Online (Sandbox Code Playgroud)
  • 您指定为preg_*函数族的第一个参数的正则表达式应该在分隔符对中分隔.由于您没有使用任何分隔符,因此会出现该错误.
  • (并且)是正则表达式中的元字符,意味着它们具有特殊含义.由于您希望匹配文字左括号和右括号,因此需要使用a来转义它们\.以下任何内容\都按字面意思处理.
  • 您可以使用正确捕获整数\d+.但捕获的整数将在$1和不在$0.$0 将具有整个匹配,即括号内的整数.

如果您执行以上所有更改,您将获得:

$result = preg_replace("#\((\d+)\)#", "$1", $string);
Run Code Online (Sandbox Code Playgroud)

  • 明白了。那么分隔符可以是任何东西吗?我已经看到 '#' 和 '/' 都有效。 (3认同)
  • 是的,您也可以使用 ~~、@@、{}、##、//、!! 还有很多 :)。但通常我们使用一个不会出现在模式中的分隔符。 (2认同)

ani*_*son 6

1)你需要有一个分隔符,/工作正常.

2)你必须逃避()字符,所以它不认为它是另一个分组.

3)此外,替换变量从1开始,而不是0(0包含FULL文本匹配,其中包括括号).

$result = preg_replace("/\((\d+)\)/", "\\1", $string);
Run Code Online (Sandbox Code Playgroud)

这样的事情应该有效.任何进一步的问题,请转到PHP的preg_replace()文档 - 它确实很好.


pix*_*x0r 4

检查文档 - 您需要在模式之前和之后使用分隔符:"/\((\d+)\)/"

您还需要转义上面的外括号,因为它们是文字,而不是嵌套的匹配组。

请参阅:preg_replace 手册页