Suche optimalen Search-Pattern zum Durchsuchen von Strings nach 5-stelligen Zahlen

Hi an alle (vermutlich eher an die PHP-Cracks unter Euch :wink: ),

in meinem Project Exporter habe ich u.A. eine Funktion, die Scripte nach 5stelligen Zahlen durchsucht, die größer 9999 und kleiner 60.000 sind (genauer: IPS-Obkjekt ID’s).

Das funktioniert mit fogendem Search-Pattern und preg_match() ziemlich gut:

$search         = '/[1-5]\d\d\d\d/'; // suche 5stellige Zahlen von 10.000 - 59.999
preg_match($search, $z, $matches);

.

Blöderweise werden hin- und wieder auch Strings gefunden, in denen zwar 5-stellige Zahlen enthalten sind, diese Strings haben aber nichts mit der IPS-ID zu tun.

Beliebte Beispiele sind Modul-ID’s (57040540-4432-4220-8D2D-4676B57E223D) oder Farbcodes (#656565). Hat jemand ne Idee, wie man Suchergebnisse ausschließen kann, deren Strings Formate wie die in den Beispielen genannten haben?

Ich kau da schon ne Weile drauf rum, aber was Gescheites hab ich bisher noch nicht ausgebrütet.

Wäre super, wenn mir jemand beim Brüten helfen kann :wink:

Hallo Raketenschnecke,

nach ObjectIDs müsste immer eines der folgenden Zeichen kommen (denke ich)
)
,
Leerzeichen

Auf jeden Fall darf das 6te Zeichen keine Zahl sein.
Das müsste sich mit RegEx doch gut prüfen lassen.

Gruß
Thorsten

Sent from my iPad using Tapatalk

Thorsten,

ich hab das jetzt nochmal durch meine Grübel-Instanz geschossen und auch heftig gegoogelt.
M.E. müsste der Suchausdruck folgender sein:

suche alle 5stelligen Zahlen (10.000 - 59.999) und schließe 6stellige Zahlen aus.
Nur wie drückt man das mit RegEx aus?

Hi,

also mal so frei aus dem Kopf müsste folgendes Pattern das gewünschte liefern:

/([1-6][0-9]{4})[^0-9]/

sollte heißen: Ausdruck, beginnt mit Ziffer 1-6, dann folgen 4 Ziffern zwischen 0 und 9 und abschießen muss der Ausdruck mit allem, nur nicht mit den Ziffern 0 bis 9. Die Klammen greifen dabei den gesuchten 5-Stelligen Zahlenwert ab.

PS: Ohne Garantie, hab kein PHP zum testen…

Gesendet von meinem GT-P7500 mit Tapatalk 2

Hi Thorsten’s,

nochmal vielen dank fürs Mitdenken :wink: Ich bin einen wesentlichen Scritt weiter: die runde Klammer war das, was mir vom Verständnis her noch fehlte.

der hier: /([1-6][0-9]{4})[^0-9]/ ist schon ziemlich dicht dran, lässt aber
in solchem String
{57040540-4432-4220-8D2D-4676B57E223D}
noch 40540 durchrutschen (wirt den als Positiv-Ergebnis aus) .

ich hab jetzt etliche Tests gemacht und mich an folgenden Pattern herangerobbt:

‚/^0-9/{-[^0-9]/‘

scheint ziemlich genau das zu sein, was ich brauche. Neben den paar Sonderzeichen vorn müssen nämlich auch noch Ziffern vorne negiert werden. Klasse!

/\b[1-5][0-9]{4}\b/
wenn die Zahl alleine auf einer Zeile steht:
/^[1-5][0-9]{4}$/
Tommi

Hi Tommi,

Danke für die Rückmeldung, ich habs grad mal durchgetestet, damit findet er leider gar keine ID?! :o

Ich weiss ja nun nicht, was Du wirklich haben wolltest, aber mit dem folgenden Snippet er genau die 5 Stelligen Ziffern bei mir. Es sollte Dir die Nutzung des \b (Wortgrenzen Operator) zeigen


function regex_test($subject) {
   if (preg_match('/\b[1-5][0-9]{4}\b/', $subject,$result)) {
	print_r ($result);
  }
}
regex_test('-12345');
regex_test('Test=12354');
regex_test('{57040540-4432-4220-8D2D-4676B57E223D}');

ergibt:

Array
(
    [0] => 12345
)
Array
(
    [0] => 12354
)

sorry, der Fehler lag bei mir: ich habe lediglich die Suchergebnisse match[1] im Script berücksichtigt.

Unter dem Strich geht es mir darum, möglichst treffsicher IPS-Objekt-ID’s in Scripts zu erkennen

Hab eben auf die Schnelle ein paar Testläufe gemacht, muss mir das aber wohl noch intensiver anschauen (welcher Such-Pattern der treffsichere ist).
bei Deinem Beispiel rutscht z.B. das hier durch:

Zeile:

// Quelle: http://www.ip-symcon.de/forum/f53/meldungsanzeige-webfront-12115/

Ergebnis:

12115/

Ich denke, da muss ich noch ein wenig rumspielen. Aber grundsätzlich ist der Weg richtig (für meinen Zweck) und die Treffsicherheit ist schon dramatisch besser geworden. Nochmal vielen Dank für die Starthilfe :wink: