如何将锚标记添加到来自文本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) . "…"; } 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¶m2=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¶m2=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/