2008-09-23 80 views

回答

2

Freepascal拥有带ParseURI功能的单元URIParser。一个示例如何使用它可以在Freepascal's source的示例之一中找到。或者一个old example这是比较容易理解。

0

URI RFC列出这个正则表达式的URI解析:

^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))? 
    12   3 4   5  6 7  8 9 

凡数字是这些群体:

$1 = http: 
    $2 = http 
    $3 = //www.ics.uci.edu 
    $4 = www.ics.uci.edu 
    $5 = /pub/ietf/uri/ 
    $6 = <undefined> 
    $7 = <undefined> 
    $8 = #Related 
    $9 = Related 

对于这个URI:

http://www.ics.uci.edu/pub/ietf/uri/#Related 

的正则表达式非常简单并且没有使用正则表达式lib具有的特殊功能o提供,所以抓住一个与你的pascal实现兼容的,并且你去了。

+0

是否接受部分网址和包含登录名/密码的网址? – 2008-09-23 22:02:55

2

我不熟悉PHP上的parse_url函数,但是您可以尝试Indy(随后包含在最新的Delphi版本中)中包含的TIdURI类。我认为他们也将它移植到FreePascal。

TIdURI是TObject的后代一个封装通用资源标识符,随着互联网的标准文献中描述:

RFC 1630 - Universal Resource Identifiers in WWW

TIdURI提供URI的组装和拆卸的方法和属性使用构成URI的组成部分,包括:协议,主机,端口,路径,文档和书签。

如果还是不行,请给你所要完成什么具体的例子 - 你在试图分析出一个URL的。

+0

我接受了Loesje的回答,因为我发现一个FreePascal的uriparser单元有一个ResolveRelativeUri,这更多的是我正在寻找的。 我确实看过了TidURI单元,我非常喜欢它。我没有充分发现像FreePascal的ResolveRelativeUri()这样的东西。 – 2008-09-24 13:11:59

1

如果你使用wininet.dll,你也可以使用他们的InternetCrackUrl API。

2

请小心Indy的TIdURI课程。它应该是一个通用的解析器,但它有一些缺陷和设计缺陷,使它无法成为完全兼容的解析器。我目前正在为Indy 11从头开始编写一个新类来替换TIdURI。它将是一个完全兼容的URI解析器,它也将支持IRI(RFC 3987)解析。

+0

这听起来不错,你有一个特定的链接,或者我应该等待Indy 11? – 2009-02-12 13:40:35