如何将锚标记添加到来自文本input的URL

我希望能够在注释字段中input用户input的文本,并检查URLtypesexpression式,如果存在,则在显示注释时添加一个定位标记(到url)。

我在服务器端使用PHP,在客户端使用Javascript(使用jQuery),所以我应该等待检查URL,直到它显示? 或者在将其插入数据库之前添加锚标签?

所以

<textarea id="comment">check out blahblah.com or www.thisthing.co.uk or http://checkthis.us/</textarea> 

 <div id="commentDisplay">check out <a href="blahblah.com">blahblah.com</a> or <a href="www.thisthing.co.uk">www.thisthing.co.uk</a> or <a href="http://checkthis.us/">http://checkthis.us/</a></div> 

首先是一个请求。 在将数据写入数据库之前不要这样做。 而是在将数据显示给最终用户之前执行此操作。 这样可以减less所有的混乱,并且可以让你在将来有更大的灵活性。

网上find一个例子如下:

 $text = preg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)?)@', '<a href="$1">$1</a>', $text); 

而daringfireball.net更彻底:

 /** * Replace links in text with html links * * @param string $text * @return string */ function auto_link_text($text) { $pattern = '#\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))#'; $callback = create_function('$matches', ' $url = array_shift($matches); $url_parts = parse_url($url); $text = parse_url($url, PHP_URL_HOST) . parse_url($url, PHP_URL_PATH); $text = preg_replace("/^www./", "", $text); $last = -(strlen(strrchr($text, "/"))) + 1; if ($last < 0) { $text = substr($text, 0, $last) . "&hellip;"; } return sprintf(\'<a rel="nowfollow" href="%s">%s</a>\', $url, $text); '); return preg_replace_callback($pattern, $callback, $text); } 

我修改了乔纳森·桑普森的正则expression式选项,以便对域是什么(不需要http(s)来限定)更为宽松。

 function hyperlinksAnchored($text) { return preg_replace('@(http)?(s)?(://)?(([-\w]+\.)+([^\s]+)+[^,.\s])@', '<a href="http$2://$4">$1$2$3$4</a>', $text); } 

适用于这些url(并成功保留了尾随句点或逗号):

 http://www.google.com/ https://www.google.com/. www.google.com www.google.com. www.google.com/test google.com google.com, google.com/test 123.com/test www.123.com.au ex-ample.com http://ex-ample.com http://ex-ample.com/test-url_chars.php?param1=val1. http://ex-ample.com/test-url_chars?param1=value1&param2=val+with%20spaces 

希望能帮助别人。

就个人而言,我会在显示之前用JS标记它,看起来比编辑用户的评论更专业和可持续。

细化Markd的答案,以避免小数,百分比,数字date(10.3.2001),省略号和IP地址的链接:

  function addLinks($text) { return preg_replace('@(http)?(s)?(://)?(([a-zA-Z])([-\w]+\.)+([^\s\.]+[^\s]*)+[^,.\s])@', '<a target="ref" href="http$2://$4">$1$2$3$4</a>', $text); } 

适用于:

http:// http://www.google.com /
https:// http://www.google.com /。
http://www.google.com
http://www.google.com
http://www.google.com/test
google.com
google.com
google.com/test
http://www.123.com.au
ex-ample.com
http:// ex-ample.com
http:// ex-ample.com/test-url_chars.php?param1=val1
http:// ex-ample.com/test-url_chars?param1=value1&param2=val+with%20spaces

不适用于:

123.com/test (没有'www'的数字域名)
继续保持平均水平(省略号)
由379万(百分比和小数)上升3.8%至394万,
编辑安德鲁·布鲁克 – 07.08.2013 19:57 dd.mm.yyyy date)
10.1.1.1 (IP地址)

我宁愿在服务器端做到这一点。 JavaScript有一个“滞后”; 它只在整个HTML DOM树被加载并显示在浏览器中时才运行。 因此,在URL被识别和parsing之前,可能需要(虽然很短)。 当客户仍然面对内容时,客户可能会看到链接被立即replace。 这可能会导致“wtf?” 在客户端的经验。 如今,这与广告/垃圾邮件/间谍软件的关系太快了。 你应该尽可能地避免这种情况。 不要使用JS来改变onload的内容,而只是在用户控制的事件(onclick,onchange,onfocus等)中进行。 保存或显示之前,使用服务器端语言更改内容。

所以,只需要寻找一个PHP脚本来分析文本(或使用正则expression式),以纯文本的forms来构build基于URL的完全适用的链接。 你可以在这里find很多。 祝你好运。

简单地build议一个有用的插件在这里: External Links https://wordpress.org/plugins/sem-external-links/