Seite 1 von 1

Nachbildung von preg_match() funktioniert nicht wie beabsich

Verfasst: 21.12.2015 22:19
von Domino
Hallo!

PHPs preg_match() möchte ich aus Gründen der Praktikabilität nachbilden und kam bisher zu einem Quältext, dessen wesentlichen Teil (selbst lauffähig) ich hier wiedergebe:

Code: Alles auswählen

Dim Teile.s(30)
Dim Auflosung.s(30)
Declare.l PregMatch(Pattern.s, String.s, Array Arr.s(1))
i = 1
Teile(1) = "640x352 [SAR 16:11 DAR 320:121]"

PregMatch("([\d]+)\w([\d]+)", Teile(i), Auflosung())
PregMatch("(\d+)x(\d+)(\s.*)?", Teile(i), Auflosung())
PregMatch("(\d+)x(\d+)(\s+\[(SAR\s+[\d+]:[\d+])?(\s+DAR\s+[\d+]:[\d+])?\])?", Teile(i), Auflosung())

Procedure.l PregMatch(Pattern.s, String.s, Array Arr.s(1))
  Define Erg.l
  Erg = CreateRegularExpression(0, Pattern)
  Debug "PregMatch(): Erg1="+Erg
  If Erg
    Erg = ExtractRegularExpression(0, String, Arr())
    Debug "PregMatch(): Erg2="+Erg
    FreeRegularExpression(0)
  EndIf
  For i=0 To ArraySize(Arr()) : Debug "Arr("+i+")="+Chr(34)+Arr(i)+Chr(34) : Next i
  Debug ""
  ProcedureReturn Erg
EndProcedure
Die dritte Zeile mit dem Funktionsaufruf möchte ich sauber abgearbeitet haben; die beiden vorherigen sind nur Vereinfachungen zur Fehlereingrenzung. Der zu untersuchende Text (hier: "Teile(i)") stammt von einem Videobearbeitungsprogramm. Leider wird den Platzhalter \d soviel Text zugewiesen, wie es nur geht und dabei wird auch das x mit aufgenommen. Weiß jemand Rat? Danke!

Gruß
Domino

Re: Nachbildung von preg_match() funktioniert nicht wie beab

Verfasst: 22.12.2015 09:38
von edel
ExtractRegularExpression gibt nur den gesamten Text zurueck, moechtest du einen Teilstring auslesen, musst du RegularExpressionGroup bemuehen.

Code: Alles auswählen

Dim Teile.s(30)
Dim Auflosung.s(0)
Declare.l PregMatch(Pattern.s, String.s, Array Arr.s(1))
i = 1
Teile(1) = "640x352 [SAR 16:11 DAR 320:121]"

PregMatch("([\d]+)\D([\d]+)", Teile(i), Auflosung())
PregMatch("(\d+)x(\d+)(\s.*)?", Teile(i), Auflosung())
PregMatch("(\d+)x(\d+)(\s+\[(SAR\s+[\d+]:[\d+])?(\s+DAR\s+[\d+]:[\d+])?\])?", Teile(i), Auflosung())

Procedure.l PregMatch(Pattern.s, String.s, Array Arr.s(1))
  Define Erg.l
  Erg = CreateRegularExpression(0, Pattern)
  Debug "PregMatch(): Erg1="+Erg
  If Erg
    Erg = ExtractRegularExpression(0, String, Arr())
    Debug "PregMatch(): Erg2="+Erg
    
    For i=0 To Erg: 
      Debug "Arr("+i+")="+Chr(34)+Arr(i)+Chr(34) : 
      If ExamineRegularExpression(0, Arr(i))
        While NextRegularExpressionMatch(0)
          Debug RegularExpressionGroup(0, 1) + " - " + RegularExpressionGroup(0, 2)
        Wend      
      EndIf
    Next i
  EndIf
    
  Debug ""
  ProcedureReturn Erg
EndProcedure

Re: Nachbildung von preg_match() funktioniert nicht wie beab

Verfasst: 22.12.2015 15:49
von Domino
Danke vorerst! Noch bekomme ich die Kiste nicht richtig hin, aber ich bleibe dran.

Gruß
Domino

[Gelöst] Re: Nachbildung von preg_match() funktioniert nicht

Verfasst: 22.12.2015 22:34
von Domino
Problem gelöst, Beispielquelltext in Tipps & Codes.
Ergänzung: Link http://www.purebasic.fr/german/viewtopi ... =8&t=29369