Seite 1 von 1

XbpCRE Problem

Verfasst: Di, 07. Feb 2012 11:48
von georg
Guten Morgen,


für ein aktuelles Problem erscheint mir die Verwendung von regulären Ausdrücken der richtige Lösungsansatz, also habe ich mir von Alaska die XbpCRE geholt und neu compiliert, da ich mit 1.90 (355) arbeite.

Aktuell brauche ich aus einer HTML-Seite alle externen Links:

Code: Alles auswählen

#INCLUDE "AppEvent.CH"
#INCLUDE "FileIO.CH"
#INCLUDE "Xbp.CH"

#INCLUDE "XbpCRE.CH"

FUNCTION Main()
	Local cData, cRes
	Local nHandle, nSize, nMatch, nStart, nLen
	Local oReg

	nHandle := fOpen("submitres.html", FO_READ)
	IF nHandle < 1
		ConfirmBox(, "Could not open input file", "Error", XBPMB_OK, XBPMB_CRITICAL)
		QUIT
	ENDIF
	nSize := fSize(nHandle)
	cData := Space(nSize)
	fRead(nHandle, @cData, nSize)
	fClose(nHandle)

	// oReg := RegExp():new('<a href="http.*</a', PCRE_CASELESS)
	oReg := RegExp():new("http:", PCRE_CASELESS)
	nMatch := oReg:exec(cData)
	IF nMatch > 0
		nStart := oReg:result(1)[1]
		nLen := oReg:result(1)[2]
		cRes := Substr(cData, nStart, nLen)
		ConfirmBox(, cRes + Chr(10) + Str(nMatch), "Result", XBPMB_OK, XBPMB_INFORMATION)
		nMatch := oReg:exec(cData, nStart + nLen + 1)
	ENDIF
RETURN (cRes)
Die Datei enthält ca. 10 externe Links, ich erhalte aber nur den ersten, d.h. nMatch ist beim ersten Aufruf 1. Der zweite Aufruf (nach ConfirmBox()), erhält wieder einen Match, nämlich weiter hinten in der Datei.

Ausgehend von der Dokumentation sollte nMatch aber die Anzahl aller Treffer liefern, und nicht iterativ abgearbeitet werden:
Returns:

On an error, the return value is negative. If positive or zero, it represents the total number of matches found.
Kann mir einer von Euch, der etwas mehr Erfahrung mit XbpCRE hat, hierzu etwas sagen? Denn das zweite Beispiel in der Dokumentation für RegExp() selbst scheint auf ein iterativ abzurufendes Ergebnis hinzudeuten.


Gruss,

Georg