10

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 Answers 2

14

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)+/.

Sign up to request clarification or add additional context in comments.

4 Comments

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);
Yes, but in that case you'll have to use a capturing group (remove the ?:).
This actually was really helpful! Thanks for the white space fix
(?=\s|$) a big big help for the regexly-challenged people! Thank you for that trick.
9

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

2 Comments

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.