【问题标题】:How to not give the link in @username when someone mention and they're together?当有人提到他们在一起时,如何不在@username 中提供链接?
【发布时间】:2016-10-20 19:43:32
【问题描述】:

如果有人发布@usernameone,它将给出链接。但问题是当他们发布类似@usernameone@usernametwo 的内容时,它仍然提供链接。我不知道如何修改此代码以使其正常工作。

function mention($text) {
$patterns = array('@(http?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@', '/@([A-Za-z0-9_]{1,15})/');
$replace = array('<a href="$1">$1</a>', '<a href="../../profile/$1">@$1</a>');
$result = preg_replace($patterns, $replace, $text);
return $result;
}

调用函数

<?php  echo mention($rowcom->description);?>

结果

预期结果

【问题讨论】:

    标签: php arrays preg-replace


    【解决方案1】:

    这段代码没有问题,只需要在$replace数组的第二个元素末尾加一个空格即可:

    function mention($text) {
        $patterns = array('@(http?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@', '/@([A-Za-z0-9_]{1,15})/');
        $replace = array('<a href="$1">$1</a>', '<a href="../../profile/$1">@$1</a> ');
        $result = preg_replace($patterns, $replace, $text);
    
        return $result;
    }
    
    echo mention('@usernameone bla bla') . '<br>';
    echo mention('@usernameone@usernametwo bla bla');
    

    输出

    @usernameonebla bla

    @usernameone@usernametwobla bla

    更新

    如果你想排除“卡住”的用户名,你的正则表达式会变得相当复杂:

    $patterns = array('@(http?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@', '/(^|[\s\.,;\?\!])@(?![A-Za-z0-9_]+@)([A-Za-z0-9_@]+)/');
    $replace = array('<a href="$1">$1</a>', '$1<a href="../../profile/$2">@$2</a> ');
    

    【讨论】:

    • 感谢您的回复.. 但如果链接在一起,我想禁用链接,因为在我的数据库中,如果它们之间没有空格,它将不会保存。
    • @mikha 我相应地编辑了答案,并添加了所有可以在用户名之前的常见标点符号。不要忘记将 $replace 行更改为 $2 而不是 $1 用于第二个替换模式。
    • 它有效,但不幸的是,如果我这样发布:that's all @userone @usertwo,结果变为:that's all@userone @usertwo。如何解决?
    • @mikha 去掉最后的空格即可:@$2&lt;/a&gt; '); => @$2&lt;/a&gt;');
    • 还是一样,没有效果
    猜你喜欢
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 2012-03-26
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 2011-08-05
    相关资源
    最近更新 更多