如何用PHP中的链接和主题标签替换纯文本URL

时间:2015-10-18 17:57:46

标签: php regex

我正在尝试将纯文本转换为链接,主题标签和@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

实际文字:

  

头此= 12345&安培;即= YES&#34;&GT; www.hello.com/about_us/test%20page/test-page.php#header此= 12345&安培;即= YES

在将哈希转换为主题标签之前,有没有办法检查哈希是否属于某个网址?

2 个答案:

答案 0 :(得分:1)

你的#strite标签是这样的:

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

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

/https?\:\/\//

你可以尝试使用负面的后视:

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

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

答案 1 :(得分:0)

对我有用的解决方案:

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