将哈希标记放入链接而不破坏使用哈希符号的链接

时间:2014-12-20 18:04:49

标签: php regex preg-replace preg-match

我有一个帖子系统,我想支持链接和哈希标签。问题是某些链接包含#,本身,并且代码尝试将链接中的#转换为更多链接!

用户可能会发布“http://somelink.com#hashKeyword #hashtag

这是我正在使用的代码。我认为它有效,除非链接包含主题标签。

$theText = "http://somelink.com#hashKeyword #hashtag";

//Convert links
$reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
if(preg_match($reg_exUrl, $theText, $url)) {
   $theText = preg_replace($reg_exUrl, '<a href="'.$url[0].'">'.$url[0].'</a>', $theText);
}

//Convert hash tags
$theText = preg_replace("/#(\w+)/", '<a href="linktohashtag/#$1">#$1</span>', $theText);

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

通过使用HamZa's commentanswer on this question,我能够解决问题。

我只是将hashtag正则表达式格式化为仅查找位于空格或帖子开头之后的标记。这样,它们就不会与普通链接发生冲突。

/(^|\s)#([A-Za-z_][A-Za-z0-9_]*)/

这是新的最后一行代码:

$theText = preg_replace("/(^|\s)#([A-Za-z_][A-Za-z0-9_]*)/", '$1<a href="linktohashtag/#$2">#$2</span>', $theText);

效果很好!谢谢大家的讨论!

答案 1 :(得分:0)

听起来你正试图用一个公式得到两个不同的结果,即X = 1,X = 2 ......但是X不能同时等于1和2。你需要做出选择并实施不同的东西。

通常,URL中的#会尝试在HTML dom中找到包含匹配id属性的元素。因此http://www.example.com/index.php#who-are-we将打开索引页面,然后将浏览器视图转移到元素<h1 id="who-are-we">。这可能是任何HTML元素,我在这个例子中只使用了h1。

关于在您的网站上创建链接,您可能希望创建一个解析它们的脚本,使它们对URL友好。因此,如果帖子标题是How to work with twitter #hashtags,您的脚本将用连字符替换空格,并删除所有非字母数字或空格。因此,您会获得how-to-work-with-twitter-hashtags之类的链接。