如何在PHP中用链接和哈希标记替换纯文本URL

如何在PHP中用链接和哈希标记替换纯文本URL,php,regex,Php,Regex,我正在尝试将纯文本转换为链接、hashtags和@tags。我已经设法部分地做到了这一点,但是找不到任何方法来区分hashtag和包含hash的链接 我刚开始使用正则表达式,所以它可能有点混乱 //link $message = preg_replace('/((http(s)?)(\:\/\/)|(www\.))([a-zA-Z0-9_\-\.\/\&\%\?\=\+\#\:\;\~\[\]\!\,\@\$\'\(\)\*]+)/', '<a href="http$3://$5$

我正在尝试将纯文本转换为链接、hashtags和@tags。我已经设法部分地做到了这一点,但是找不到任何方法来区分hashtag和包含hash的链接

我刚开始使用正则表达式,所以它可能有点混乱

//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 );
//链接
$message=preg\u replace('/((http(s))(\:\/\/)(www\)([a-zA-Z0-9\-.\/\&\%\?\=\+\\\\\:\\\[\]\!\,\@\\\\\\\.*]+','$message);
//处理
$message=preg_replace('/[@]+([A-Za-z0-9-+)/','','$message);
//标签
$message=preg_replace('/[#]+([A-Za-z0-9-#]+)/',''$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的一部分?

哈希标记的正则表达式如下:

/[#]+([A-Za-z0-9-_]+)/
您声明的目标是确保它不是URL的一部分,您可以通过以下方式进行标识:

/https?\:\/\//
你可以试着用消极的眼光看后面:

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

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

一个对我有效的解决方案:

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

$message=preg_replace('/^(?非常感谢-我确实需要使用负面回顾,但它也需要使用start with此答案缺少教育性解释。