views:

345

answers:

4

I am trying to take a string of text like so:

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

In every instance where there is a positive integer inside of parentheses, I'd like to replace that with simply the integer itself.

The code I'm using now is:

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

But I keep getting a "Delimiter must not be alphanumeric or backslash" error.

Any thoughts? I know there are other questions on here that sort of answer the question, but my knowledge of regex is not enough to switch it over to this example.

A: 

Check the docs - you need to use a delimiter before and after your pattern: "/\((\d+)\)/"

You'll also want to escape the outer parentheses above as they are literals, not a nested matching group.

See: preg_replace manual page

pix0r
A: 

1) You need to have a delimeter, the '/' works fine.

2) You have to escape the '(' and ')' characters so it doesn't think it's another grouping.

3) Also, the replace variables here start at 1, not 0 (0 contains the FULL text match, which would include the parentheses).

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

Something like this should work. Any further questions, go to PHP's preg_replace() documentation - it really is good.

animuson
A: 

Try:

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

The parenthesis chars are special chars in a regular expression. You need to escape them to use them.

Atli
+4  A: 

You are almost there. You are using:

$result = preg_replace("((\d+))", "$0", $string);
  • The regex you specify as the 1st argument to preg_* family of function should be delimited in pair of delimiters. Since you are not using any delimiters you get that error.
  • ( and ) are meta char in a regex, meaning they have special meaning. Since you want to match literal open parenthesis and close parenthesis, you need to escape them using a \. Anything following \ is treated literally.
  • You can capturing the integer correctly using \d+. But the captured integer will be in $1 and not $0. $0 will have the entire match, that is integer within parenthesis.

If you do all the above changes you'll get:

$result = preg_replace("#\((\d+)\)#", "$1", $string);
codaddict
+1 for the detailed answer! :O
TiuTalk
Gotcha. So the delimiters can be just about anything? I have seen '#' and '/' both work.
Christopher
Yes, you can also use ~~, @@, {}, ##, //, !! and many more :). But usually we use a delimiter which does not appear in the pattern.
codaddict