模拟PHP函数parse_url的Delphi / FreePascal lib或者函数

时间:2020-03-06 14:37:49  来源:igfitidea点击:

我正在用Object Pascal做站点地图生成器,需要一个好的函数或者lib来模拟PHP上的parse_url函数。

有谁知道任何好人吗?

解决方案

URI RFC列出了此正则表达式用于URI解析:

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

这些组的编号是:

 = http:
   = http
   = //www.ics.uci.edu
   = www.ics.uci.edu
   = /pub/ietf/uri/
   = <undefined>
   = <undefined>
   = #Related
   = Related

对于此URI:

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

正则表达式非常简单,并且不使用正则表达式库必须提供的特殊功能,因此请抓住与pascal实现兼容的正则表达式。

我对PHP上的parse_url函数不熟悉,但是我们可以尝试Indy附带的TIdURI类(最新的Delphi版本中附带的TIdURI类)。我认为他们也将其移植到FreePascal。

TIdURI is a TObject descendant that encapsulates a Universal Resource Identifier, as described in the Internet Standards document: 
  
  
    RFC 1630 - Universal Resource Identifiers in WWW

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

如果这不起作用,请给出一个具体示例,说明我们要完成的工作,以及要尝试从URL解析的内容。

如果我们使用的是wininet.dll,则还可以使用其InternetCrackUrl API。

Freepascal具有带ParseURI函数的URIParser单元。在Freepascal的源代码中的一个示例中可以找到如何使用它的示例。还是一个较容易理解的旧示例。

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