Reguläre Ausdrücke und Leerzeichen

  • Hey Forum,

    ich brauch mal eure Hilfe. Folgendes Problem:

    PHP
    if(preg_match("![ ]{5}.*!", $line)) {
                mach_was();
    }


    Nur wenn es genau 5 Leerzeichen (Spaces) sind soll er die IF-Verzweigung ausführen. Allerdings frisst er diese Bedingung nicht. Er führt es immer aus, sobald zumindest ein Leerzeichen am Anfang der Zeile steht. Kann man die genaue Anzahl Leerzeichen in einem regulären Ausdruck nicht vorgeben?

  • Ich hab ein TXT-Datei, die ich zeilenweise auslese.
    Wenn er eine Zeile findet mit dem eben genannten Ausdruck, welche demzufolge mit "genau" fünf Leerzeichen beginnt, ruf ich wieder eine Funktion auf, was aber hier jetzt nicht weiter interessiert.
    Allerdings ruft er die Funktion im Moment auch auf, wenn nur ein Leerzeichen oder so am Zeilenanfang ist, er sollte dies aber nur bei mindestens 5 tun.

  • Code
    [\s]{5}[\w]{1,}

    Der würde z.B. gehen.. es kommt halt darauf an, wass du auslesen willst.

    Ich hab jetzt einfach mal einen Buchstaben genommen, der mind. 1 mal vorkommt.

    bzw. ein einfach "^" davor ohne die "" steht für den Zeilenanfang

    [SIGPIC][/SIGPIC]

  • Er würde die Zeile jetzt nur nehmen, wenn am Anfang der Zeile 5 Leerzeichen kommen und dann der Buchstabe.

    Du kannst auch folgendes benutzen.


    Code
    (?<![\w])[\s]{5}[\w]{1,}

    Jetzt findet er es nur, wenn vor den 5 Leerzeichen kein Buchstabe kommt.

    [SIGPIC][/SIGPIC]

  • Ich würde das an deiner Stelle über alle "Nicht-Wort-Zeichen" lösen.

    PHP
    if(preg_match("#[\W]{5}#", $line)) {
                mach_was();
    }
    PHP
    '#[\W]{5}#'

    Definiert alle nicht Wort Zeichen, also Whitespaces. Wenn du solche Zeichen genau ansprechen willst, wie Umbrüüche etc. nimmst du \r,\n,\t.

    Über [ ] bekommst du kein Leerzeichen hin.

    wert.TeeeX.de
    Wie gut ist die technische Umsetztung deiner Website wirklich?
    Teste es!


  • Und wenn du die schnauze voll hast dann machst du sowas


  • Und wenn du die schnauze voll hast dann machst du sowas

    Ist richtig, ich stimme aber ehr für saubere RegularExpressions, besonders, wenn du öfters und detallierter Daten auswerten und auch weiterverwenden willst, außerdem ist es manchmal ganz gut, den schwierigeren Weg zu gehen, um das Thema zu lernen... =)

    wert.TeeeX.de
    Wie gut ist die technische Umsetztung deiner Website wirklich?
    Teste es!

  • Wollt damit nur aufmerksam machen das man nicht immer gleich zu RegularExpressions greifen muss, gibt genug Funktionen die fast alles auch gut bzw besser ersetzen

  • Wenn CroweHammer sowieso in einer php umgebung arbeitet (also php zum auswerten der Regexes nutzt), ist es schneller soweit als möglich die php-internen string-funktionen zu nutzen. Das wird auch auf php.net geraten.

    Aber:

    Zitat


    außerdem ist es manchmal ganz gut, den schwierigeren Weg zu gehen, um das Thema zu lernen... =)

    Dem stimme ich natürlich uneingeschränkt zu ;)


  • Ich hab es jetzt so versucht:

    ![\W]{5}[\w]{1,}.*!

    Jetzt erkennt er den Regex wenigstens nur noch, wenn es fünf oder mehr Leerzeichen am Anfang sind. Allerdings soll er es nur erkennen, wenn es genau fünf sind, deshalb hab ich es versucht wie eben geschrieben, aber es funktioniert nicht.
    Was ist falsch o.o?

    PS: Um auf Pions Vorschlag zurückzukommen? Hast du den getestet? Ich habe es spaßeshalber ausprobiert, aber er funktioniert nicht.

    4 Mal editiert, zuletzt von CroweHammer (24. März 2010 um 09:50)

  • Was heist hier spaßes halber das ist die sinnvollerer Lösung...

    Klar geht der, wenn dein String 5 Leerzeichen am Anfang hat dann funktioniert das (aber nur leerzeichen)

  • Sers Pion,

    okay, dass es die bessere Lösung ist lass ich mich gerne überzeugen.
    Wenn ich jedenfalls deine Lösung verwende ruft er die Funktion immer auf, egal ob Leerzeichen vorne dran stehen, egal wie viele oder keine.
    Vielleicht ist es ein Problem, dass die betreffenden Zeilen aus einem TXT-File eingelesen werden?

    Gruß

    CroweHammer

  • Daran sollte es nicht liegen, wenn du die Daten korrekt übermittelst.

    Zeige doch mal deinen Code!

    Oder schreibs um, mir ist ja immer noch nicht ganz klar, warum und wie du das machen willst.
    So sucht er nach 5 Leerzeichen und wenn er welche findet, führt er einen Befehl aus... ^^

    PHP
    <?php
    $string = '     blabla';
    if(eregi("     ",$string))
    {
        echo "blabla komische funktion hierrein"; 
    }
    
    
    ?>

    Edit:

    Und hier

    PHP
    "![\W]{5}[\w]{1,}.*!"


    Musst du ihm natürlich sagen, dass davor auch etwas kommen muss, genauso wie danach, sonst macht er ja immer weiter.
    Siehe Tutorial.

    wert.TeeeX.de
    Wie gut ist die technische Umsetztung deiner Website wirklich?
    Teste es!

    Einmal editiert, zuletzt von -Bambino- (25. März 2010 um 11:50)