Thomas Owens
Thomas Owens

Reputation: 116169

How to access capture groups in the replacement parameter of preg_replace()?

$output = preg_replace("|(/D)(/s+)(/d+)(;)|", "//1,//3;", $output);

I'm trying to replace all alphabetical character followed by one or more whitespace characters (tabs and/or spaces) followed by one or more numerical characters followed by a semicolon with the alphabetical character followed by a comma followed by the numerical digits and then the semicolon.

I'll provide an example:

Start:

hello world      1007;

End:

hello world,1007;

Upvotes: 2

Views: 439

Answers (3)

samjudson
samjudson

Reputation: 56853

The two | at the start and end probably are incorrect - and should both be forward-slashes.

All other forward slashes should be backward slashes (and need escaping).

And since PHP 4.04 $n is the preferred way of referring to a capture group.

$output = preg_replace("/(\\D)\\s+(\\d+;)/", "$1,$2", $output);

If you use single quotes you don't need to escape your backslashes:

$output = preg_replace('/(\D)\s+(\d+;)/', '$1,$2', $output);

Upvotes: 6

Alana Storm
Alana Storm

Reputation: 166046

You want backslashes in the regular expression, not forward slashes. The starting and ending pipes are needed (or another delimiter for the regex)

$x = "hello world      1007;";    
echo preg_replace('|(\D)(\s+)(\d+)(;)|','$1,$3',$x);
echo preg_replace('/(\D)(\s+)(\d+)(;)/','$1,$3',$x);
echo preg_replace('{(\D)(\s+)(\d+)(;)}','$1,$3',$x);

Upvotes: 1

T Percival
T Percival

Reputation: 8674

Should those forward-slashes be backslashes? You'll need to escape them for PHP too unless you change your double-quotes to single-quotes.

Upvotes: 3

Related Questions