php regex - 将所有@usernames替换为字符串中的链接

标签 php regex preg-replace

我正在我的网站上实现一个时间线系统,用户可以在时间线中使用 @username(如 Twitter)提及其他用户。

我想将@用户名转换为链接并将其指向他们的个人资料

我的字符串:

$timeline="@fred-ii 's posts on @stackoverflow are intresting."; 

我使用以下代码将 @username 替换为 url :

echo preg_replace("/@([^\s]+)/i","<a href='http://example.com/$1'>@$1</a>",$timeline);

它有效,问题是它也匹配空格

这个字符串

"@fred-ii 's posts on@stackoverflow";

on@stackoverflow 之间没有空格,我想排除它,

所以我更新了我的正则表达式

/\s+@([^\s]+)/

它有效,但它与我的字符串的第一部分(用户名 @fred-ii )不匹配。我认为正则表达式引擎正在字符串开头查找空格。

我需要更改模式中的哪些内容才能匹配所有@用户名?

$timeline="@fred-ii 's posts on @stackoverflow are intresting."; 

最佳答案

您可以使用lookbehind negative assertion来做到这一点:

/(?<!\w)@([^\s]+)/

(?<!\w)告诉正则表达式引擎匹配 @([^\s]+)仅当其前面没有单词 \w 时。它将在您给出的示例中工作,也许您必须随时调整它。

示例代码:

$pattern = "/(?<!\w)@([^\s]+)/";
$subject = "@fred-ii 's posts on @stackoverflow are interesting. @fred-ii 's posts on@stackoverflow";

preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER );

foreach($matches as $item)
{
    echo $item[1] . "<br/>";
}

产生此输出:

fred-ii
stackoverflow
fred-ii

参见 action .

关于php regex - 将所有@usernames替换为字符串中的链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33844826/

相关文章:

php - 在手动安装 PHP 5.6.34(线程安全包)的 IIS 7.5 上使用 guzzle 时出现问题

php - 我可以用单引号回显变量吗?

java - 如何用一个替换字符串中的多个斜杠和反斜杠?

regex - OCaml:如何从字符串中删除所有非字母字符?

regex - 正则表达式 : how to ignore rest of the line

PHP 用主题字符串中的模式替换正则表达式

php - 如何在 PHP 中使用正则表达式删除前导字符和查询字符?

javascript - 将 PHP preg_replace 转换为 javascript 并将其设置为递归

php - 如何将 HTML 页面视为 PHP 页面?

php - 使用 MYSQL,从子查询中选择每第 n 行 SELECT