Bestimmte Stellen aus Textdateien heraussuchen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
anzahl
array
ausgabe
beispiel
bestimmte stellen
code
element
funktion
gesamte treffer
getestet code
inhalt
input
lass code
laufen
operator
output
text
treffer
vorkommnis
zweiter treffer
-
Hi ihr,
Ich suche nach einer Möglichkeit, wie ich mit PHP bestimmte Stellen aus Text- oder anderen Dateien heraussuchen kann.
Beispiel-Textdatei:
<text>Irgendein Text 1</text> <text>Irgendein Text 2</text>
Das PHP-Programm sollte jetzt zurückgeben, was zwischen den beiden Elementen "<text>" und "</text>" steht, also in diesem Beispiel eben "Irgendein Text 1" bzw. "Irgendein Text 2".
Wichtig wäre mir, dass das Prog nicht nur den ersten Text wiedergibt, sondern erst überprüft, wieviele <text> Elemente es gibt und dann die Wiedergabe dementsprechend anpasst.
Wer eine Lösung weiß, darf sich gerne melden ;)
MfG Mermadalis
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
<? preg_match_all('~<text>(.*)</text>~Uis',$input_file,$output_array); ?>
So oder so ähnlich sollte es gehen, wie du die Rückgabewerte der Funktion auswertest steht im PHP-Manual. -
Die Funktion preg_match liefert die Anzahl aller Vorkommnisse einer Regex zurück und den ersten Treffer.
Die Funktion preg_match_all liefert die Anzahl aller Vorkommnisse einer Regex zurück und alle Treffer.
Edit: Hmm, tct war schneller. ^^
~<text>(.*?)</text>~Uis
schmeißt dir auch gleich noch alle leeren Treffer weg.
Beitrag zuletzt geändert: 28.7.2009 18:31:49 von census -
Und wie gebe ich den Inhalt mit "echo" aus? Bzw. in welcher Variablen wird der Inhalt gespeichert?
-
mermadalis schrieb:
Und wie gebe ich den Inhalt mit "echo" aus? Bzw. in welcher Variablen wird der Inhalt gespeichert?
In dem Beispiel von tct ist es in dem Array "$output_array".
Ich gebe Dir mal einen funktionierenden php-Code mit echo-Ausgabe (getestet):
<?php $input_file="<text>Irgendein Text 1</text> <text>Irgendein Text 2</text>"; preg_match_all('~<text>(.*)</text>~Uis',$input_file,$output_array); echo "<br><br>Der Text in dem gesucht wird: <br> $input_file"; echo "<br><br>Das gesamte Treffer-Array:<br>"; print_r($output_array); echo "<br><br>Erster Treffer:<br> ".$output_array[1][0]." <br>Zweiter Treffer:<br> ".$output_array[1][1]; ?>
Das kommt bei diesem Code raus:
<br><br>Der Text in dem gesucht wird: <br> <text>Irgendein Text 1</text> <text>Irgendein Text 2</text><br><br>Das gesamte Treffer-Array:<br>Array ( [0] => Array ( [0] => <text>Irgendein Text 1</text> [1] => <text>Irgendein Text 2</text> ) [1] => Array ( [0] => Irgendein Text 1 [1] => Irgendein Text 2 ) ) <br><br>Erster Treffer:<br> Irgendein Text 1 <br>Zweiter Treffer:<br> Irgendein Text 2
Beitrag zuletzt geändert: 28.7.2009 20:57:34 von simuliertes -
Ok, vielen Dank.
Jetzt hätte ich noch eine Frage:
Wie lese ich mehrere Sachen auf einmal heraus?
Beispiel:
<text> Irgendein Text 1 <b> Irgendein anderer Text 1 </b> </text> <text> Irgendein Text 2 <b> Irgendein anderer Text 2 </b> </text>
Ich hätte jetzt gerne, dass die Ausgabe so aussieht:
Text: Irgendein Text 1 & B: Irgendein anderer Text 1
Text: Irgendein Text 2 & B: Irgendein anderer Text 2
usw.
Wenn ihr mir da auch noch helfen könntet, wär das echt super!
MfG Mermadalis -
Hmm, Regex sind eigentlich iterativ und nicht rekursiv. Das heißt du hast 2 Möglichkeiten:
A: Du rekursierst selbst:
Lass
gegen deinen Input laufen und ersetze alle Vorkommnisse durch<(.*?)>(.*?)</\1>
. (Wobei $n die n-te Capturing Group ist). Danach lass die selbe Regex solange rekursiv gegen das Ergebnis laufen, bis du kein Match mehr hast.$1: $2
B: PHP kann das evtl auch
In einigen Sprachen gibt es Rekursion in Regex, zum Beispiel in perl. Da es in PHP einen ?R-Operator gibt, könnte das funktionieren:
(Nicht getestet weil ich kein PHP zur Hand habe.<(.*?)>(?:(.*?)|(?R))</\1>
C: Du schneidest ab
Wenn du weißt, wie tief maximal die Rekursion ist, kannst du die auch hard-coden.
Oder du schaust nur auf die öffnenden Tags und gehst davon aus, das die Tags balanced sind und keine Singleton. Die Regex
liefert bei allen Ersetzungen (match_all) durch(?:<([^/]{1}.*?)>)|(?:</.*?()>)(.*?)
folgendes Ergebnis:$1: $2
Input: <text> Irgendein Text 1 <b> Irgendein anderer Text 1 </b> </text> <text> Irgendein Text 2 <b> Irgendein anderer Text 2 </b> </text> Output: text: Irgendein Text 1 b: Irgendein anderer Text 1 : : text: Irgendein Text 2 b: Irgendein anderer Text 2 : :
Beitrag zuletzt geändert: 29.7.2009 2:55:21 von census -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage