views:

186

answers:

2

I'm trying to find every instance of @username in comment text and replace it with a link. Here's my PHP so far:

$comment = preg_replace('/@(.+?)\s/', '<a href="/users/${1}/">@${1}</a> ', $comment);

The only problem is the regex is dependent upon there being whitespace after the @username reference. Can anyone help me tweak this so it will also match if it is at the end of the string?

+2  A: 

try /@(\w+)/ instead of /@(.+?)\s/.

J-16 SDiZ
Excellent - that worked perfectly! Can you tell me more about \w?
Kirk
@Kirk: \w simply matches any 'word' character: A-Za-z0-9_
animuson
+2  A: 

To detect whitespace or end of string, you would use: /@(.+?)(?=\s|$)/, but unless your usernames contain non-alphanumeric characters, it's simpler to use the \w for word character or \b for word break, i.e.: /@(.+?)\b/ or /@(\w)+/.

Max Shawabkeh
Or could we use that to determine whether to add a white-space at the end of the link? `$comment = preg_replace('/@(.+?)(?:\s|$)/', '<a href="/users/${1}/">@${1}</a>${2}', $comment);`
animuson
Yes, but in that case you'll have to use a capturing group (remove the `?:`).
Max Shawabkeh
This actually was really helpful! Thanks for the white space fix
Kirk