我有这个文字:
$string = "this is my friend's website http://example.com I think it is coll";
如何将链接提取到另一个变量?
我知道它应该是通过使用正则表达式,preg_match()
但我不知道如何?
可能最安全的方法是使用WordPress的代码片段.下载最新版本(目前为3.1.1)并查看wp-includes/formatting.php.有一个名为make_clickable的函数,它有param的纯文本并返回格式化的字符串.您可以获取用于提取URL的代码.虽然这很复杂.
这一行正则表达式可能会有所帮助.
preg_match_all('#\bhttps?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#', $string, $match);
但是这个正则表达式仍然无法删除一些格式错误的URL(例如http://google:ha.ckers.org
).
另请参见: 如何模拟StackOverflow自动链接行为
我尝试按照Nobu的说法,使用Wordpress,但是为了与其他WordPress函数有很多依赖关系,我选择使用Nobu的正则表达式preg_match_all()
并将其转换为函数,使用preg_replace_callback()
; 一个函数,它现在用可点击的链接替换文本中的所有链接.它使用匿名函数,因此您需要PHP 5.3,或者您可以重写代码以使用普通函数.
]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#'; return preg_replace_callback($regex, function ($matches) { return "{$matches[0]}"; }, $text); }
URL的定义非常复杂 - 您必须先确定要捕获的内容.开始一个简单的例子捕捉任何与http://
和https://
可能是:
preg_match_all('!https?://\S+!', $string, $matches); $all_urls = $matches[0];
请注意,这是非常基本的,可能会捕获无效的网址.我建议赶上POSIX和PHP正则表达式来处理更复杂的事情.
如果您从中提取URL的文本是用户提交的,并且您将在任何地方将结果显示为链接,那么您必须非常非常小心地避免XSS漏洞,最突出的是"javascript:"协议URL,但也会出现格式错误网址可能会诱使你的正则表达式和/或显示浏览器进入执行它们的JavaScript网址.至少,您应该只接受以"http","https"或"ftp"开头的网址.
Jeff 还有一篇 博客文章,其中描述了提取URL的其他一些问题.
你可以这样做..
6> Kai Noack..:适合我的代码(特别是如果你的$ string中有几个链接)是:
$string = "this is my friend's website http://example.com I think it is cool, but this is cooler http://www.memelpower.com :)"; $regex = '/\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i'; preg_match_all($regex, $string, $matches); $urls = $matches[0]; // go over all links foreach($urls as $url) { echo $url.'
'; }希望能帮助他人.