php Text nach Muster durchsuchen

Hallo zusammen,

ich möchte einen Text in php nach einem bestimmtem Muster durchsuchen. Das Ziel ist es, dass eine 12-stellige Ziffernreihenfolge am Ende ausgegeben wird.

Die Reihenfolge besteht immer aus 2 Buchstaben und 10 Ziffern (können also Buchstaben und Zahlen beinhalten). Diese Sache ist allerdings nicht fix zwischen einem bestimmten Text eingebunden (sonst könnte man das ja bequem per preg_match aussortieren ;)).

Bisher sieht mein Fortschritt so aus:

PHP:
$muster = "auch";
		$Text = "Unter anderem sind auch JF498i053193 zu finden. Die ersten beiden Ziffern sind immer Buchstaben, ansonsten können 10 Zahlen und Buchstaben folgen";
		$Text = explode (" ",$Text);
		$Anzahl = count ($Text);
		$Woerter = array ();
		$letzesvorkommen = -1;
		for ($x=1;$x<=$Anzahl;$x++){
			if ($muster == $Text["$x"]){
				$z = $x;
				$z--;

				for ($zähler=$letzesvorkommen + 1;$zähler<$x;$zähler++){
					$Woerter[] = $Text["$zähler"];
				}
				$z = $z + 2;
				$Woerter[] = $Text["$z"];
				$letzesvorkommen = $x + 1;
			}
		}
		print_r ($Woerter);

Damit bekomme ich zwar die Ziffernreihenfolge in die Ausgabe rein (Arrayeintrag 4), wobei z. B. die anderen Arrayeinträge nicht notwendig. Außerdem ist das "auch", nach dem momentan gefiltert wird, eben auch nicht fix, sondern variabel.

Weiß da jemand weiter?
 
Ich verstehe das Problem mit preg_match nicht. Du musst ja nicht mit festen Strings arbeiten, sondern nur mit Mustern. Kannst du hierfür ein Beispiel geben in welchem Fall es nicht funktionieren würde?

Spontan würde ich daher z.B. Folgendes vorschlagen: Beispiel RegEx (o.ä.)
 
Ich verstehe das Problem mit preg_match nicht.

Spontan würde ich daher z.B. Folgendes vorschlagen: Beispiel RegEx (o.ä.)

Das Problem mit preg_match hab ich auch nicht so richtig verstanden, hab aber mal Deinen Regulären Ausdruck noch ein bisschen angepasst, da er ja meinte dass die 10 Ziffern aus Zahlen und Buchstaben bestehen können.

Angepasster RegEx

@Deyaz
Sollte die Ziffernfolge aber auch nur aus Buchstaben bestehen können, dann hast Du definitiv ein Problem, denn dann wird es schwieriger.
 
Ich bin ein Freund von kleinen Portionen: Wenn ich (Fließ)Texte habe und nach bestimmten Mustern suche, die Zeichenmässig begrenzt sind, so sammle ich die erstmal alle potentiellen Kandidaten ein. In deinem Fall würde ich (also ICH) aus dem Text zunächst alle die Wörter einsammeln, die meinem Muster in der Länge entsprechen.
Am Ende habe ich dann dann ein Array mit N (abgeschlossenen!) Zeichenketten, die ich testen kann, ohne mich in den RegEX Stolperfallen zu verfangen.

Den "Matcher", der dann auch RegEX beinhalten darf, würde ich in eine separate Funktion auslagern. So hast du diesen Teil weggekapselt und kannst auch besser testen.

Sieht zwar etwas altbacken aus, aber dafür sparst du dir lange Grübeleien, wenn du dir nach Monaten/Wochen deinen eigenen Code anguckst.

Hier mal ein Beispiel in Perl:

Code:
#!/usr/bin/perl

$muster     = "sddasd";
$laenge_foo = 12;   ## Laenge deines "fixen" strings
$text       = "Dies ist der Testtesxt. Der sollte passen: KD3273638263  der hier aber nicht  KD32736382633 und der hier auch nicht KDQ373638263 und so weiter .... sddasd .. aber der hier passt wieder Id3273638263";

@test = split(/ /,$text);

foreach my $word (@test)
{
  if ($laenge_foo == length($word) || length($word) == length($muster))
  {
    &matcher($word, $muster);
  }
}

sub matcher()
{
  my $str    = shift;
  my $muster = shift;

  ### Variables Muster auch als RegEx möglich
  if ($str eq $muster)
  {
    print "Muster passt ($str eq $muster)\n";
  }
   
   ### wesentlich übersichtlichere RegEx
   ### Anpassen auf deine Bedürfnisse
   if ($str =~ /^([A-Za-z]{2})\d{8}/)
   {
      print "RegEX passt $str ==  /^([A-Za-z]{2})\d{8}/)\n";
   }
}

Dein variables Muster kannst du auch als RegEx verwenden. Allerdings musst du darauf achten dass du die richtigen Zeichen auch mit "" versiehst.
 
Zurück
Oben