PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : String nach Wörtern zerlegen


verkehrsminister
28.06.2007, 17:35
Hallo alle miteinander,

mit dem folgenden Problem schlage ich mich schon seit geraumer Zeit herum, habe auch schon diverse Lektüre durch und wende mich jetzt hilfesuchend an euch.

Ich habe einen String
wort1: etwas Text
wort2: noch etwas Text
wort3: jetzt sogar mehr-
zeiliger Text
totalandereswort: wir kommen zum Schluß

daraus soll letztendlich das hier werden (Pseudo-PHP-Array-Code)
$arr[0]['wort'] = 'wort1';
$arr[0]['value'] = 'etwas Text';
$arr[1]['wort'] = 'wort2';
$arr[1]['value'] = 'noch mehr Text';
$arr[2]['wort'] = 'wort3';
$arr[2]['value'] = 'jetzt sogar mehr-
zeiliger Text';
$arr[3]['wort'] = 'totalandereswort';
$arr[3]['value'] = 'wir kommen zum Schluß';

Ist klar, das ist noch nicht ganz das Array, das z.B. preg_match_all() (PHP) erzeugt, aber es ließe sich fix daraus bauen.

Doch ich finde leider keinen passenden Regex. Weiß jemand Rat?

Für Zeichenklassen habe ich eine probate Lösung, aber dafür sind hier nicht die Voraussetzungen gegeben. Trotzdem geb ich die nochmal dazu, vielleicht dient die ja als Lösungsansatz. Im folgenden gehe ich davon aus, das der Text nach "[.*]" keine eckigen Klammern enthalten darf und so bekomme ich die Zeichenklasse [^\[\]]. So kann ich sowohl "[.*]" als auch alles andere schön zuordnen.

Text:
[a] 11111
[bb] 22222
[ccc] 33
3333

Pattern:
/(\[.*\])(.[^\[\]]*)/

Ähm, und vielen Dank im Voraus...


smg
28.06.2007, 17:55
Hi!
Vielleicht bereitest du deine mehrzeiligen Text jeweils in einzeilige Texte mit sed oder so auf (Tipp: Falls Ende der einen Zeile ein Dash (-) ist dann hänge den Text der nächsten Zeile dran.) und dann das hier, ohne Regex, zwar nicht elegant aber na ja. :)

$FH = fopen("input.txt", "r");
$count = 0;
$werte = array ();
while (!feof($FH)) {
$line = fgets($FH);
$tmp = explode(":", $line);
$key = $tmp[0];
$value = $tmp[1];
$werte[$count++]['wort'] = ltrim($value);
$werte[$count]['value'] = $key;
}
fclose($FH);
print "";

Ich programmiere eigentlich kein PHP, aber das sollte klappen, wenn der Text in einzeiligem Format vorliegt.

kill4h`
28.06.2007, 17:57
Also einzeiligen Text zu fischen ist ja recht einfach. Du hast Key-Value-Paare, das heisst du musst dir den Schlüssel und den Wert capturen.
#^([^\s:]+):\s(.+)$#Kurze Erklärung:
^ bedeutet, dass die Kette am Anfang der Zeile stehen muss
[^\s:]+ alle Zeichen außer Whitespace und : ein- oder mehrmals
das steht in Klammern, somit wird der gematchte Teil eingefangen
: das Trennzeichen
\s ein Whitespace (besser als einfach nur " " zu setzen)
.+ irgendein beliebiges Zeichen, mindestens einmal
$ Zeilenende

Bei mehrzeiligem Text kannst du glaube ich in PHP Newlines ignorieren (das $ muss dann aber wohl auch weg), da bin ich mir aber grad nicht so sicher. Lies dir dazu am besten die Docs zu allen Funktionen für PCRE in PHP (http://de.php.net/pcre) durch.

smg
28.06.2007, 18:02
Multiline Modus solltest du dir auch mal angucken.