【问题标题】:How to replace plain text URLs with links and hashtags in PHP如何用 PHP 中的链接和主题标签替换纯文本 URL
【发布时间】:2016-01-17 00:39:05
【问题描述】:

我正在尝试将纯文本转换为链接、主题标签和@tags。我已经设法部分做到了这一点,但找不到任何区分主题标签和包含哈希的链接的方法。

我是使用正则表达式的新手,所以可能有点乱!

//link
$message = preg_replace('/((http(s)?)(\:\/\/)|(www\.))([a-zA-Z0-9_\-\.\/\&\%\?\=\+\#\:\;\~\[\]\!\,\@\$\'\(\)\*]+)/', '<a href="http$3://$5$6">$0</a>', $message );
//handle
$message = preg_replace('/[@]+([A-Za-z0-9-_]+)/', '<a href="#$1">$1</a>', $message );
//hashtag
$message = preg_replace('/[#]+([A-Za-z0-9-_]+)/', '<a href="#$1">$1</a>', $message );

纯文本根据需要转换为链接,然后在散列点处中断。

所需文字:

www.hello.com/about_us/test%20page/test-page.php#header?this=12345&that=YES

实际文字:

header?this=12345&that=YES">www.hello.com/about_us/test%20page/test-page.php#header?this=12345&that=YES

在将其转换为主题标签之前,是否有任何方法可以检查哈希是否是 URL 的一部分?

【问题讨论】:

    标签: php regex


    【解决方案1】:

    您的主题标签正则表达式是这样的:

    /[#]+([A-Za-z0-9-_]+)/
    

    您声明的目标是确保它不属于您通过以下方式识别的网址的一部分:

    /https?\:\/\//
    

    您可以尝试使用消极的后视:

    /(?<!https?\:\/\/)[^#]*[#]+([A-Za-z0-9-_]+)
    

    这对于所有一般情况来说是不够的,但听起来您正在尝试在您控制的范围内解决问题(您拥有的文本文件或其他东西),所以希望这能对您有所帮助。

    【讨论】:

    • 非常感谢 - 我确实需要使用负面的后视,但它也需要使用 start-with
    【解决方案2】:

    对我有用的解决方案:

    $message = preg_replace('/^(?<!http)^(?<!www\.)[#]+([A-Za-z0-9-_]+)/', '<a href="#$1">$1</a>', $message );//#hashtag
    

    【讨论】:

    • 这个答案缺少教育解释。
    猜你喜欢
    • 2013-06-19
    • 2014-04-07
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    相关资源
    最近更新 更多