2010-03-27 35 views
27

我试图采取文本字符串,像这样:使用preg_replace的PHP:“分隔符不能是字母数字或反斜杠”错误。

$string = "This (1) is (2) my (3) example (4) text"; 

在每一个实例,其中有括号内的正整数,我想替换成简单的整数本身。

我现在使用的代码是:

$result = preg_replace("\((\d+)\)", "$0", $string); 

但我不断收到一个“分隔符不能是字母,数字或反斜线”的错误。

有什么想法?我知道这里有其他问题可以回答这个问题,但是我对正则表达式的了解还不足以将其转换为此示例。

+3

如果任何人的疑惑,为什么所有的答案说时,他们已经在那里添加反斜杠,那是因为他们不显示本来。 @Christopher,你应该总是格式化代码示例(尤其是正则表达式!),方法是缩进四个空格或用反引号括起来。 – 2010-03-27 04:36:41

+0

谢谢 - 很高兴知道! – Christopher 2010-03-29 04:07:55

+0

由于您刚接触到stackoverflow,因此我想告诉您,您可以通过点击该答案旁边的复选标记来接受**您认为最有用的答案。 – codaddict 2010-03-29 04:22:34

回答

1

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

您也想逃避上面他们是文字,而不是一个嵌套的匹配组外括号。

请参见:preg_replace manual page

3

1)你必须有一个分隔符,则 '/' 工作正常。

2)你必须逃避'('和')'字符,所以它不认为它是另一个分组。 3)另外,这里的替换变量从1开始,而不是0(0包含全文匹配,其中包括圆括号)。

$result = preg_replace("/\((\d+)\)/", "\\1", $string); 

像这样的东西应该工作。任何进一步的问题,请参阅PHP's preg_replace() documentation - 它确实很好。

0

尝试:

<?php 
$string = "This (1) is (2) my (3) example (4) text"; 
$output = preg_replace('/\((\d)\)/i', '$1', $string); 
echo $output; 
?> 

括号字符是在正则表达式特殊字符。你需要逃避他们使用它们。

38

你几乎在那里。您正在使用:

$result = preg_replace("((\d+))", "$0", $string); 
  • 指定为第一 参数preg_*家庭的功能 应该对 分隔符分隔的正则表达式。由于你没有使用 任何分隔符,你会得到该错误。
  • ( and )是meta char在正则表达式中, 意思是它们有特殊含义。 既然你想匹配文字开放 括号和右括号, 你需要使用\转义它们。 以下任何内容\字面上均视为 。
  • 您可以使用\d+正确捕获整数 。但捕获的 整数将在$1而不是$0$0 将会有整个匹配,即括号内的整数为 。

如果你做到以上的变化,你会得到:

$result = preg_replace("#\((\d+)\)#", "$1", $string); 
+0

+1为详细答案! :O – 2010-03-27 03:35:37

+1

Gotcha。所以分隔符可以是任何东西?我看到'#'和'/'都起作用。 – Christopher 2010-03-29 04:08:51

+1

是的,你也可以使用~~,@@,{},##,//,!!还有很多 :)。但通常我们使用一个没有出现在模式中的分隔符。 – codaddict 2010-03-29 04:18:40

相关问题