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)
Ausgehend von der Dokumentation sollte nMatch aber die Anzahl aller Treffer liefern, und nicht iterativ abgearbeitet werden:
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.Returns:
On an error, the return value is negative. If positive or zero, it represents the total number of matches found.
Gruss,
Georg