views:

24

answers:

1

So I hadn't done any regexps for a while, so I thought I'd brush up on my memory. I'm trying to convert a string like a*b*c into a<b>b</b>c. I've already gotten that working, but now I want to keep a string like a\*b\*c from turning into a\<b>b\</b>c, but rather, into a*b*c. Here's the code I'm using now:

     $string = preg_replace("/\*([\s\S]*?)\*/", "<b>$1</b>", $input);

I've tried putting this \\\\{0} in before the asterisks, and that didn't work. Neither did [^\\\\].

+2  A: 

Try negative lookbehind:

"/(?<!\\\\)\*([\s\S]*?)(?<!\\\\)\*/"

This only matches a * if it's not preceded by a \.

This is brittle, though; it would also fail if the string is escaped backslash \\*bold* text.

Tim Pietzcker
I get an error when trying that: `Warning: preg_replace() [function.preg-replace]: Compilation failed: missing ) at offset 26`
TheAdamGaskins
When I use four backslashes, instead of two, it works exactly like I need it to! Thanks!
TheAdamGaskins
Ah yes, right. You do need four backslashes - I have corrected my answer.
Tim Pietzcker