kostenloser Webspace werbefrei: lima-city


Bestimmte Stellen aus Textdateien heraussuchen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    mermadalis

    Kostenloser Webspace von mermadalis

    mermadalis hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. <?
    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.
  4. c****s

    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
  5. Autor dieses Themas

    mermadalis

    Kostenloser Webspace von mermadalis

    mermadalis hat kostenlosen Webspace.

    Und wie gebe ich den Inhalt mit "echo" aus? Bzw. in welcher Variablen wird der Inhalt gespeichert?
  6. 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
  7. Autor dieses Themas

    mermadalis

    Kostenloser Webspace von mermadalis

    mermadalis hat kostenlosen Webspace.

    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
  8. c****s

    Hmm, Regex sind eigentlich iterativ und nicht rekursiv. Das heißt du hast 2 Möglichkeiten:

    A: Du rekursierst selbst:
    Lass
    <(.*?)>(.*?)</\1>
    gegen deinen Input laufen und ersetze alle Vorkommnisse durch
    $1: $2
    . (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.

    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:
    <(.*?)>(?:(.*?)|(?R))</\1>
    (Nicht getestet weil ich kein PHP zur Hand habe.

    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
    (?:<([^/]{1}.*?)>)|(?:</.*?()>)(.*?)
    liefert bei allen Ersetzungen (match_all) durch
    $1: $2
    folgendes Ergebnis:

    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
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!