如何在Delphi中实现一组标准的超链接检测规则

时间:2012-01-23 03:58:52

标签: delphi hyperlink string-matching

我目前在程序中自动检测文本中的超链接。我做得很简单,只找 http:// www。

但是,用户建议我将其扩展为其他形式,例如: https:// .com

然后我意识到它可能不止于此,因为有ftp和mailto和文件,所有其他顶级域名,甚至电子邮件地址和文件路径。

我认为最好的方法是通过遵循当前使用的一些常用的标准超链接检测规则集来限制它。也许Microsoft Word是如何做到的,或者RichEdit是如何做到的,或者你知道更好的标准。

所以我的问题是:

是否有内置函数可以从Delphi调用来进行检测,如果有,那么调用会是什么样的? (我计划将来去FireMonkey,所以我更喜欢能在Windows之外运行的东西。)

如果没有可用的功能,是否有一些地方我可以找到一组记录在Word,RichEdit中检测到的内容的规则,或者应该检测到的任何其他规则集?那样我就可以自己编写检测代码了。

3 个答案:

答案 0 :(得分:7)

尝试ShLwApi单位中声明的PathIsURL函数。

答案 1 :(得分:3)

从RegexBuddy的库中获取正则表达式可能会让您开始(我无法对性能做出任何声明)

<强>正则表达式

Match; JGsoft; case insensitive:  
\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|$!:,.;]*[A-Z0-9+&@#/%=~_|$]

<强>解释

  

网址:全文查找      最后一个字符类确保如果URL是某些文本的一部分,      URL未被解释为部分后,标点符号(如逗号或句点)      的URL。

匹配(全部或部分)

http://regexbuddy.com
http://www.regexbuddy.com 
http://www.regexbuddy.com/ 
http://www.regexbuddy.com/index.html 
http://www.regexbuddy.com/index.html?source=library 
You can download RegexBuddy at http://www.regexbuddy.com/download.html.

不匹配

regexbuddy.com
www.regexbuddy.com
"www.domain.com/quoted URL with spaces"
support@regexbuddy.com

对于一组规则,您可以查看RFC 3986

  

统一资源标识符(URI)是一个紧凑的序列   标识抽象或物理资源的字符。这
  规范定义了通用URI语法和
进程   解析可能是相对形式的URI引用,以及
  关于使用URI的准则和安全考虑因素   网络

验证RFC 3986中指定的URL的正则表达式

^
(# Scheme
 [a-z][a-z0-9+\-.]*:
 (# Authority & path
  //
  ([a-z0-9\-._~%!$&'()*+,;=]+@)?              # User
  ([a-z0-9\-._~%]+                            # Named host
  |\[[a-f0-9:.]+\]                            # IPv6 host
  |\[v[a-f0-9][a-z0-9\-._~%!$&'()*+,;=:]+\])  # IPvFuture host
  (:[0-9]+)?                                  # Port
  (/[a-z0-9\-._~%!$&'()*+,;=:@]+)*/?          # Path
 |# Path without authority
  (/?[a-z0-9\-._~%!$&'()*+,;=:@]+(/[a-z0-9\-._~%!$&'()*+,;=:@]+)*/?)?
 )
|# Relative URL (no scheme or authority)
 ([a-z0-9\-._~%!$&'()*+,;=@]+(/[a-z0-9\-._~%!$&'()*+,;=:@]+)*/?  # Relative path
 |(/[a-z0-9\-._~%!$&'()*+,;=:@]+)+/?)                            # Absolute path
)
# Query
(\?[a-z0-9\-._~%!$&'()*+,;=:@/?]*)?
# Fragment
(\#[a-z0-9\-._~%!$&'()*+,;=:@/?]*)?
$

答案 2 :(得分:1)

可以使用正则表达式来定义您认为适当的超链接的各种模式。