从php中的字符串中提取一个或多个url

时间:2010-11-06 09:23:51

标签: php regex

我正在尝试从php中的纯文本字符串中提取一个或多个url。这是一些例子

"mydomain.com has hit the headlines again"

提取“http://www.mydomain.com

"this is 1 domain.com and this is anotherdomain.co.uk but sometimes http://thirddomain.net"

提取“http://www.domain.com”,“http://www.anotherdomain.co.uk”,“http://www.thirddomain.net

我需要两种特殊情况 - 我正在考虑正则表达式,但不完全理解它们 1)所有符号如'('或')'和空格(不包括连字符)都需要删除 2)单词dot需要用符号替换。 ,所以dot com将是.com

p.s我知道PHP validation/regex for URL,但无法解决如何使用它来实现最终目标。

由于

1 个答案:

答案 0 :(得分:4)

在这种情况下,很难获得100%正确的结果。 根据输入的不同,您可能会尝试强制匹配最常用的第一级域名(添加更多内容):

(?:https?://)?[a-zA-Z0-9\-\.]+\.(?:com|org|net|biz|edu|uk|ly|gov)\b

您可能需要删除单词边界(\ b)以获得不同的结果。

你可以在这里测试一下:

http://bit.ly/dlrgzQ

编辑:关于你的案件 1)从什么中移除? 2)这可以在php中完成:

 $result = preg_replace('/\s+dot\s+(?=(com|org|net|biz|edu|and_ect))/', '.', $input);

但我没有什么重要的注意事项:

  • 此正则表达式更像是指导,而不是实际的生产代码
  • 使用这种松散的文本规则至少是古怪的 - 添加更多特殊情况会使它更加疯狂。考虑一下 - 即使stackoverflow也不这样做:
  

http://example.org

     

但不是!

     

example.org

  • 如果你说你想要达到的目标会更容易吗?因为如果你想在WWW上某处处理某种文本,那么这是非常糟糕的主意!你不应该自己这样做(正如你所说 - 你不懂正则表达式!),因为这只是XSS蠕虫的能量。更好地考虑某种Markdown语言或BBCore或其他。

也对:http://htmlpurifier.org/

感兴趣