58

I am trying to grab the capital letters of a couple of words and wrap them in span tags. I am using preg_replace for extract and wrapping purposes, but it's not outputting anything.

preg_replace("/[A-Z]/", "<span class=\"initial\">$1</span>", $str)
Andy Lester
  • 91,102
  • 13
  • 100
  • 152
Polsonby
  • 22,825
  • 19
  • 59
  • 74

4 Answers4

59

You need to put the pattern in parentheses /([A-Z])/, like this:

preg_replace("/([A-Z])/", "<span class=\"initial\">$1</span>", $str)
Andrew
  • 18,680
  • 13
  • 103
  • 118
Polsonby
  • 22,825
  • 19
  • 59
  • 74
32

\0 will also match the entire matched expression without doing an explicit capture using parenthesis.

preg_replace("/[A-Z]/", "<span class=\"initial\">\\0</span>", $str)

As always, you can go to php.net/preg_replace or php.net/<whatever search term> to search the documentation quickly. Quoth the documentation:

\0 or $0 refers to the text matched by the whole pattern.

HamZa
  • 14,671
  • 11
  • 54
  • 75
John Douthat
  • 40,711
  • 10
  • 69
  • 66
8

From the preg_replace documentation on php.net:

replacement may contain references of the form \n or (since PHP 4.0.4) $n, with the latter form being the preferred one. Every such reference will be replaced by the text captured by the n'th parenthesized pattern.

See Flubba's example.

Wedge
  • 19,513
  • 7
  • 48
  • 71
5

Use parentheses around your desired capture.

Dinah
  • 52,922
  • 30
  • 133
  • 149