Una manera rápida y fácil de analizar URI como se ha visto en librerías comerciales
NOTA: si usted tiene una biblioteca de Internet, entonces ya tiene URI funciones de análisis, sin embargo, esto puede servir como una manera alternativa, un cheque en cómo el algoritmo de análisis de las obras, una manera de pasar un crédito artículo, de una manera que llama a alguien de codificación, etc
en Indy(Directa a Internet) para URI análisis de verificación TIdURI de la clase en idURI unidad
en TurboPower Profesional de Internet para IpMisc unidad de función IpParseURL
No sé acerca de ICS aunque
UN URI es la forma en que una dirección de internet se presenta, la mayoría de los protocolos de seguir un URI. Un URI tiene la siguiente sintaxis:
[PROTOCOLO ://]HOST[:PUERTO][SUBDIRECTORIOS][DOCUMENTOS][# MARCADOR]
Ahora, esta es la forma en que se me ocurrió para URI de análisis, el código está comentado
< & & & & & & & & & & -COMENZAR CÓDIGO & & & & & & & & & & & & & ->
función IsNumber(ACharacter: Char): Boolean
begin
& nbsp & nbsp Resultado := Pos(ACharacter, '0123456789') > 0
fin
{Analizar los parámetros de una URL en un TStrings
& nbsp EJ. http://search.yahoo.com/bin/search?p=britney spears
& nbsp Dest[0] = 'p=britney spears'
& nbsp acceso A parámetros y valores de verificación TStringList.Nombres y
& nbsp TStringList.Los valores}
procedimiento SplitParams(const Params: Cadena Dest: TStrings)
var
& nbsp & nbsp p: Integer
& nbsp & nbsp Tmp: String
begin
& nbsp & nbsp si no Asignados(Dest), a continuación, Salir
& nbsp & nbsp Dest.Claro
& nbsp & nbsp Tmp := Params
& nbsp & nbsp p := Pos(' & ', Tmp)
& nbsp & nbsp mientras (p > 0) hacer
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp Dest.Agregar(Copia(Tmp, 1, p -1))
& nbsp & nbsp & nbsp & nbsp Tmp := Copy(Tmp, P 1, Length(Tmp) - p)
& nbsp & nbsp & nbsp & nbsp p := Pos(' & ', Tmp)
& nbsp & nbsp final
& nbsp & nbsp Dest.Agregar(Tmp)
fin
{Dada una URL de verificación para una consulta, retorno de la consulta de partida
& nbsp posición, y los parámetros en Params, esta función utiliza SplitParams}
procedimiento ProcessQuery(const URL: String Params: TStrings var QueryPos: Integer)
begin
& nbsp & nbsp //Nada después de el ? son parámetros para enviarlos a splitparams
& nbsp & nbsp QueryPos := Pos('?', URL)
& nbsp & nbsp si QueryPos > 0, entonces
& nbsp & nbsp & nbsp & nbsp SplitParams(Copia(URL, QueryPos 1, Length(URL) -QueryPos), Params)
fin
{Dada una URL obtener el nombre del documento
& nbsp hay algunos casos especiales a este:
& nbsp & nbsp 1) si la URL es de la forma http://www.hello.com no hay ningún documento
& nbsp & nbsp & nbsp & nbsp & nbsp pero cuando se consulta al servidor devolverá uno, así que el regreso
& nbsp & nbsp & nbsp & nbsp & nbsp ningún documento
& nbsp & nbsp 2) si la URL es de la forma http://www.hi.com/index.php o
& nbsp & nbsp & nbsp & nbsp & nbsp http://www.hi.com/index.php#estees o
& nbsp & nbsp & nbsp & nbsp & nbsp http://www.hi.com/index.php#estees?howareyou=hacker
& nbsp & nbsp & nbsp & nbsp & nbsp entonces documento es index.php olvidar cualquier otra cosa}
función QueryDocument(const URL: String var DocPos: Integer): String
var
& nbsp & nbsp QueryPos, i: Integer
begin
& nbsp & nbsp Resultado := '
& nbsp & nbsp //verificación de los parámetros
& nbsp & nbsp ProcessQuery(URL, nil, QueryPos)
& nbsp & nbsp si (QueryPos > 0) entonces
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp dic(QueryPos)
& nbsp & nbsp & nbsp & nbsp i := QueryPos
& nbsp & nbsp & nbsp & nbsp mientras URL[QueryPos] <> '/' do dec(i)
& nbsp & nbsp & nbsp & nbsp inc(i)
& nbsp & nbsp & nbsp & nbsp Resultado := Copy(URL, i 1, QueryPos)
& nbsp & nbsp final
& nbsp & nbsp else
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp {QueryPos no se encuentra intentar conseguir un docname o
& nbsp & nbsp & nbsp & nbsp & nbsp comprobar si no hay ningún documento en la mano}
& nbsp & nbsp & nbsp & nbsp i := Largo(URL)
& nbsp & nbsp & nbsp & nbsp mientras URL[i] <> '/' do dec(i)
& nbsp & nbsp & nbsp & nbsp inc(i)
& nbsp & nbsp & nbsp & nbsp DocPos := i
& nbsp & nbsp & nbsp & nbsp if (i >= Pos('://', URL) 3) a continuación,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Copy(URL, i, Longitud(URL))
& nbsp & nbsp & nbsp & nbsp else
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp //no hay Ningún documento o la url de la forma www.hello.com
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := '
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Salida
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp final
& nbsp & nbsp //verificación de los marcadores en el documento
& nbsp & nbsp si Pos('#', Resultado) > 0, entonces
& nbsp & nbsp & nbsp & nbsp Resultado := Copy(Resultado, 1, Pos('#', Resultado) -1)
& nbsp & nbsp si pos('/', Resultado) >0, entonces
& nbsp & nbsp & nbsp & nbsp Eliminar(Resultado, pos('/', Resultado), 1)
fin
{Consulta el número de puerto de un url en caso de cualquier
& nbsp EJ. www.hello.com:8000
& nbsp QueryPort volverá 8000 bien devolverá 0}
función QueryPort(const URL: String): Integer
var
& nbsp & nbsp DotIdx, SlashIdx: Integer
& nbsp & nbsp Tmp, de Búfer: String
begin
& nbsp & nbsp Tmp := URL
& nbsp & nbsp si Pos('://', Tmp) > 0, entonces
& nbsp & nbsp & nbsp & nbsp Eliminar(Tmp, Pos('://', Tmp), 3)
& nbsp & nbsp SlashIdx := Pos('/', Tmp) -1
& nbsp & nbsp si SlashIdx < 0, entonces
& nbsp & nbsp & nbsp & nbsp SlashIdx := Largo(Tmp)
& nbsp & nbsp DotIdx := Pos(':', Tmp)
& nbsp & nbsp si DotIdx < 0, entonces
& nbsp & nbsp // no Número de Puerto para salir correctamente
& nbsp & nbsp & nbsp & nbsp Salida
& nbsp & nbsp Búfer := Copy(Tmp, DotIdx 1, SlashIdx)
& nbsp & nbsp val(Buffer, Resultado, DotIdx)
fin
{Consulta de un Marcador en un documento
& nbsp EJ. www.hello.com/index.htm#notwelcome
& nbsp QueryBookMark volverá 'notwelcome'}
función QueryBookmark(const URL: String): String
var
& nbsp & nbsp HashPos: Integer
& nbsp & nbsp QuestionPos: Integer
begin
& nbsp & nbsp HashPos:= Pos('#', URL)
& nbsp & nbsp si (HashPos <= 0) a continuación, Salida
& nbsp & nbsp QuestionPos:= Pos('?', URL)
& nbsp & nbsp si (QuestionPos <= 0) entonces
& nbsp & nbsp & nbsp & nbsp QuestionPos := Largo(URL)
& nbsp & nbsp Resultado := Copy(URL, HashPos 1, QuestionPos-1)
fin
procedimiento ParseURI(const URI: String var Host, Documento, Marcador, Puerto: String QueryParams: TStrings)
var
& nbsp & nbsp QueryPos, DocPos: Integer
begin
& nbsp & nbsp ProcessQuery(URI, QueryParams, QueryPos)
& nbsp & nbsp Marcador := QueryBookmark(URI)
& nbsp & nbsp Puerto := IntTOStr(QueryPort(URI))
& nbsp & nbsp Documento := QueryDocument(URI, DocPos)
& nbsp & nbsp Host := Copy(URI, 1, DocPos -1)
fin
< & & & & & & & & & & -CÓDIGO de FIN de & & & & & & & & & & & & & & ->
Por la forma en que este algoritmo manera puede ser extendida, expandida, etc., y estoy trabajando en ello. Cualquier sugerencia, comentario, crítica, deja un comentario.
BUGS CONOCIDOS:
& nbsp & nbsp * Según algunas fuentes, la función de punto de venta no es tan rápido como debería ser y no puede ser utilizado para la cadena de posicionamiento
& nbsp & nbsp * Sí, sé que este no es el mejor algoritmo para la URI de análisis, a partir de este escrito estoy trabajando en mejoras, código ampliaciones etc.
El analisis de uri
El analisis de uri : Multi-millones de consejos para hacer su vida mas facil.
Una manera rapida y facil de analizar URI como se ha visto en librerias comerciales
NOTA: si usted tiene una biblioteca de Internet, entonces ya tiene URI funciones de analisis, sin embargo, esto puede servir como una manera alternativa, un cheque en como el algoritmo de analisis de las obras, una manera de pasar un credito articulo, de una manera que llama a alguien de codificacion, etc
en Indy(Directa a Internet) para URI analisis de verificacion TIdURI de la clase en idURI unidad
en TurboPower Profesional de Internet para IpMisc unidad de funcion IpParseURL
No se acerca de ICS aunque
UN URI es la forma en que una direccion de internet se presenta, la mayoria de los protocolos de seguir un URI. Un URI tiene la siguiente sintaxis:
[PROTOCOLO ://]HOST[:PUERTO][SUBDIRECTORIOS][DOCUMENTOS][# MARCADOR]
Ahora, esta es la forma en que se me ocurrio para URI de analisis, el codigo esta comentado
< & & & & & & & & & & -COMENZAR CODIGO & & & & & & & & & & & & & ->
funcion IsNumber(ACharacter: Char): Boolean
begin
& nbsp & nbsp Resultado := Pos(ACharacter, '0123456789') > 0
fin
{Analizar los parametros de una URL en un TStrings
& nbsp EJ. http://search.yahoo.com/bin/search?p=britney spears
& nbsp Dest[0] = 'p=britney spears'
& nbsp acceso A parametros y valores de verificacion TStringList.Nombres y
& nbsp TStringList.Los valores}
procedimiento SplitParams(const Params: Cadena Dest: TStrings)
var
& nbsp & nbsp p: Integer
& nbsp & nbsp Tmp: String
begin
& nbsp & nbsp si no Asignados(Dest), a continuacion, Salir
& nbsp & nbsp Dest.Claro
& nbsp & nbsp Tmp := Params
& nbsp & nbsp p := Pos(' & ', Tmp)
& nbsp & nbsp mientras (p > 0) hacer
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp Dest.Agregar(Copia(Tmp, 1, p -1))
& nbsp & nbsp & nbsp & nbsp Tmp := Copy(Tmp, P 1, Length(Tmp) - p)
& nbsp & nbsp & nbsp & nbsp p := Pos(' & ', Tmp)
& nbsp & nbsp final
& nbsp & nbsp Dest.Agregar(Tmp)
fin
{Dada una URL de verificacion para una consulta, retorno de la consulta de partida
& nbsp posicion, y los parametros en Params, esta funcion utiliza SplitParams}
procedimiento ProcessQuery(const URL: String Params: TStrings var QueryPos: Integer)
begin
& nbsp & nbsp //Nada despues de el ? son parametros para enviarlos a splitparams
& nbsp & nbsp QueryPos := Pos('?', URL)
& nbsp & nbsp si QueryPos > 0, entonces
& nbsp & nbsp & nbsp & nbsp SplitParams(Copia(URL, QueryPos 1, Length(URL) -QueryPos), Params)
fin
{Dada una URL obtener el nombre del documento
& nbsp hay algunos casos especiales a este:
& nbsp & nbsp 1) si la URL es de la forma http://www.hello.com no hay ningun documento
& nbsp & nbsp & nbsp & nbsp & nbsp pero cuando se consulta al servidor devolvera uno, asi que el regreso
& nbsp & nbsp & nbsp & nbsp & nbsp ningun documento
& nbsp & nbsp 2) si la URL es de la forma http://www.hi.com/index.php o
& nbsp & nbsp & nbsp & nbsp & nbsp http://www.hi.com/index.php#estees o
& nbsp & nbsp & nbsp & nbsp & nbsp http://www.hi.com/index.php#estees?howareyou=hacker
& nbsp & nbsp & nbsp & nbsp & nbsp entonces documento es index.php olvidar cualquier otra cosa}
funcion QueryDocument(const URL: String var DocPos: Integer): String
var
& nbsp & nbsp QueryPos, i: Integer
begin
& nbsp & nbsp Resultado := '
& nbsp & nbsp //verificacion de los parametros
& nbsp & nbsp ProcessQuery(URL, nil, QueryPos)
& nbsp & nbsp si (QueryPos > 0) entonces
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp dic(QueryPos)
& nbsp & nbsp & nbsp & nbsp i := QueryPos
& nbsp & nbsp & nbsp & nbsp mientras URL[QueryPos] <> '/' do dec(i)
& nbsp & nbsp & nbsp & nbsp inc(i)
& nbsp & nbsp & nbsp & nbsp Resultado := Copy(URL, i 1, QueryPos)
& nbsp & nbsp final
& nbsp & nbsp else
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp {QueryPos no se encuentra intentar conseguir un docname o
& nbsp & nbsp & nbsp & nbsp & nbsp comprobar si no hay ningun documento en la mano}
& nbsp & nbsp & nbsp & nbsp i := Largo(URL)
& nbsp & nbsp & nbsp & nbsp mientras URL[i] <> '/' do dec(i)
& nbsp & nbsp & nbsp & nbsp inc(i)
& nbsp & nbsp & nbsp & nbsp DocPos := i
& nbsp & nbsp & nbsp & nbsp if (i >= Pos('://', URL) 3) a continuacion,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Copy(URL, i, Longitud(URL))
& nbsp & nbsp & nbsp & nbsp else
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp //no hay Ningun documento o la url de la forma www.hello.com
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := '
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Salida
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp final
& nbsp & nbsp //verificacion de los marcadores en el documento
& nbsp & nbsp si Pos('#', Resultado) > 0, entonces
& nbsp & nbsp & nbsp & nbsp Resultado := Copy(Resultado, 1, Pos('#', Resultado) -1)
& nbsp & nbsp si pos('/', Resultado) >0, entonces
& nbsp & nbsp & nbsp & nbsp Eliminar(Resultado, pos('/', Resultado), 1)
fin
{Consulta el numero de puerto de un url en caso de cualquier
& nbsp EJ. www.hello.com:8000
& nbsp QueryPort volvera 8000 bien devolvera 0}
funcion QueryPort(const URL: String): Integer
var
& nbsp & nbsp DotIdx, SlashIdx: Integer
& nbsp & nbsp Tmp, de Bufer: String
begin
& nbsp & nbsp Tmp := URL
& nbsp & nbsp si Pos('://', Tmp) > 0, entonces
& nbsp & nbsp & nbsp & nbsp Eliminar(Tmp, Pos('://', Tmp), 3)
& nbsp & nbsp SlashIdx := Pos('/', Tmp) -1
& nbsp & nbsp si SlashIdx < 0, entonces
& nbsp & nbsp & nbsp & nbsp SlashIdx := Largo(Tmp)
& nbsp & nbsp DotIdx := Pos(':', Tmp)
& nbsp & nbsp si DotIdx < 0, entonces
& nbsp & nbsp // no Numero de Puerto para salir correctamente
& nbsp & nbsp & nbsp & nbsp Salida
& nbsp & nbsp Bufer := Copy(Tmp, DotIdx 1, SlashIdx)
& nbsp & nbsp val(Buffer, Resultado, DotIdx)
fin
{Consulta de un Marcador en un documento
& nbsp EJ. www.hello.com/index.htm#notwelcome
& nbsp QueryBookMark volvera 'notwelcome'}
funcion QueryBookmark(const URL: String): String
var
& nbsp & nbsp HashPos: Integer
& nbsp & nbsp QuestionPos: Integer
begin
& nbsp & nbsp HashPos:= Pos('#', URL)
& nbsp & nbsp si (HashPos <= 0) a continuacion, Salida
& nbsp & nbsp QuestionPos:= Pos('?', URL)
& nbsp & nbsp si (QuestionPos <= 0) entonces
& nbsp & nbsp & nbsp & nbsp QuestionPos := Largo(URL)
& nbsp & nbsp Resultado := Copy(URL, HashPos 1, QuestionPos-1)
fin
procedimiento ParseURI(const URI: String var Host, Documento, Marcador, Puerto: String QueryParams: TStrings)
var
& nbsp & nbsp QueryPos, DocPos: Integer
begin
& nbsp & nbsp ProcessQuery(URI, QueryParams, QueryPos)
& nbsp & nbsp Marcador := QueryBookmark(URI)
& nbsp & nbsp Puerto := IntTOStr(QueryPort(URI))
& nbsp & nbsp Documento := QueryDocument(URI, DocPos)
& nbsp & nbsp Host := Copy(URI, 1, DocPos -1)
fin
< & & & & & & & & & & -CODIGO de FIN de & & & & & & & & & & & & & & ->
Por la forma en que este algoritmo manera puede ser extendida, expandida, etc., y estoy trabajando en ello. Cualquier sugerencia, comentario, critica, deja un comentario.
BUGS CONOCIDOS:
& nbsp & nbsp * Segun algunas fuentes, la funcion de punto de venta no es tan rapido como deberia ser y no puede ser utilizado para la cadena de posicionamiento
& nbsp & nbsp * Si, se que este no es el mejor algoritmo para la URI de analisis, a partir de este escrito estoy trabajando en mejoras, codigo ampliaciones etc.