• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Frage Hilfe bei RegExp

Spoiler

Mitglied
Servus,

ich benötige mal Hilfe von die RegExp-Spezialisten hier.

Mein String schau etwa so aus:

\t12345678\t\t12345678901234\01.01.1970\tTestfeld\tTextfeld\tTextfeld\t\t123456

\t ist der Tabulator
Textfeld ist jeweil ein beliebig langes Feld, dass beliebig viele Zeichen enthalten kann (also alle Zeichen außer Tabulator).

Ich müsste jetzt gezielt das erste Textfeld, dann das Zweite und dann das Dritte auslesen.
Mit \t.*\t liefert er immer nur das Erste.

Wie mach ich dem denn jetzt klar, dass das Zweite gemeint ist?

Danke und Gruß

Spoiler
 
Werbung:
PHP:
$string = '\t12345678\t\t12345678901234\01.01.1970\tTestfeld\tTextfeld\tTextfeld\t\t123456';
$string = str_replace('\t', ' ', $string);
preg_match_all('/[a-zA-Z0-9.]+/i', $string, $fields, PREG_SET_ORDER);

var_dump($fields);

Wenn dein Textfeld natürlich auch Leerzeichen enthält musst du es halt abändern.
 
Also wenn zwischen einem Wert immer ein \t steht. Dann müsste bei deinem Beispiel oben ja der erste Wert fehlen und zwischen zwei \t\t auch oder?
Jedenfalls würde es bei mir gerade kein Sinn machen.

Aber du hättest auch explode verwenden können

PHP:
$string = '\t12345678\t\t12345678901234\01.01.1970\tTestfeld\tTextfeld\tTextfeld\t\t123456';
$fields = explode("\\t", $string);

echo "<pre>";
print_r($fields);
echo "</pre>";

Es kommt halt drauf an ob in dem String Daten fehlen zwischen \t\t oder nicht.
 
Werbung:
Also wenn zwischen einem Wert immer ein \t steht. Dann müsste bei deinem Beispiel oben ja der erste Wert fehlen und zwischen zwei \t\t auch oder?
Jedenfalls würde es bei mir gerade kein Sinn machen.

Aber du hättest auch explode verwenden können

PHP:
$string = '\t12345678\t\t12345678901234\01.01.1970\tTestfeld\tTextfeld\tTextfeld\t\t123456';
$fields = explode("\\t", $string);

echo "<pre>";
print_r($fields);
echo "</pre>";

Es kommt halt drauf an ob in dem String Daten fehlen zwischen \t\t oder nicht.
Ne, die Werte fehlen nicht, habs ja vorher ausprobiert und ja die Idee mit explode ist mir dann auch in den Sinn gekommen. Sollte eig. völlig ausreichen.
 
Also explode funktioniert mit Sicherheit.

Bei den Daten handelt es sich um einen Export aus SAP ... da fängt die Zeile mit einem Tab an und nach dem ersten Feld sind dann 2 Tabs ... ist halt so.

Die grundsätzliche Frage ist für mich halt, kann ich einen RegExp schreiben, der in diesem Beispiel quasi negativ maskiert?
Der normale Ausdruck maskiert quasi das, was ich suche und entfernt den Rest ... kann ich auch was schreiben, was auf den Rest passt und diesen dann entfernt?
Nach dem Motte "NICHT /^\t[0-9]{8}\t" zum Beispiel ... müsste dann am Zeilenanfang \t12345678\t entfernen.

Gibt's sowas?

Danke im Voraus.
 
Willst du denn als Ergebnis nur \t12345678\t haben oder willst du als Ergebnis den restlichen String haben, also
\t12345678901234\01.01.1970\tTestfeld\tTextfeld\tTextfeld\t\t123456

?

Sry falls ich doof frage, irgendwie bin ich net ganz auf den Beinen :D
 
Werbung:
Achso, dann müsste es ja hiermit gehen
ich gehe mal davon aus, dass zwischen 12345678901234\01.01.1970 das t fehlt, also 12345678901234 \t 01.01.1970 oder?

PHP:
$input_lines= "\t12345678\t\t12345678901234\t01.01.1970\tTestfeld\tTextfeld\tTextfeld\t\t123456";
preg_match_all("/\\t([a-zA-Z0-9.]+)/", $input_lines, $output_array);

echo "<pre>";
print_r($output_array[1]);
echo "</pre>";

Ansonsten hier noch der Link zum Tester
Und noch auf preg_match_all stellen
 
Wenn \t ein Trenner ist, ist der richtige Weg im Sinne von KISS (keep it short and simple) sicher explode() zu verwenden.
Natürlich kann man auch RegExp verwenden, aber das ist in diesem Fall wohl eher mit Kanonen auf Spatzen schiessen.

http://us1.php.net/manual/de/function.str-getcsv.php könnte auch eine Möglichkeit sein.
PHP:
<?PHP
error_reporting(-1);
ini_set('display_errors','On');

$string = "test\t12345\tProbe";
$arra_y = str_getcsv($string, "\t");

print_r($arra_y);

PS
Da dein Textfeld beliebige Zeichen beinhalten kann, solltest du bedenken, dass ein \t (Tab) im Text ebenfalls vorkommen kann. sollte das zum Problem werden, ist ein Trenner auf Basis ^*^ ja auch denkbar.

PPS
Der Vollständigkeit halber, Die Umkehr von explode ist übrigens implode()
 
Zuletzt bearbeitet:
Werbung:
Ich danke euch für die Ideen.
Mein Grundsätzliches Problem war, wie ich hier zwischen den Textfeldern unterscheiden kann ... die sehen ja alle 3 gleich aus.
Das Pattern '/\t.*\t/' passt ja auf alle 3.
Wie also wähle ich nun also das dritte Textfeld und hole mir von diesem die Daten?
 
Zurück
Oben