2008-09-23 83 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