Griever: [*] erkennen und * zurückgeben aus string

Hi.

Eigentlich nen einfaches Anliegen:

$string = "ich möchte das hier [meinsmiley] abfangen";

es soll erkannt werden, ob nur kleine buchstaben drin sind, die klammern auch drumrum sind (also nich "[meinsmiley blabla") und es soll mir der einzelne String (z. B. "[meinsmiley]") zurückgegeben werden (als Array).

sodass aus:

$string = "hier sind die dinger [n1] und noch eins [n2]";

folgendes zurückgegeben wird:

Array {
        [0] => "[n1]";
        [1] => "[n2]";
}

ich habe jetzt stundenlang rumgetüftelt und nichts hinbekommen. auch zahlreiche Suchen bei Google und durchforsten von mehreren Foren gab kein brauchbares Ergebnis für mich.

Wenn möglich, könnte mir da einer vielleicht ne Klasse schreiben, die das macht?

Ziel dieser Funktion:
Ich möchte in meiner Shoutbox ein dynamisches Smiley-System erstellen. Die bilder sind jeweils im gif-format mit dem namen "s_smiley.gif", wobei "smiley" in dem namen dafür genutzt werden soll, um es dem string "[smiley]" zuzuordnen.
Dabei ist aber eine file_exists-abfrage von nöten, damit ich auch prüfen kann, ob die datei überhaupt existiert. Erst dann würde ich die direkte ersetzung vornehmen.

MFG
Griever

  1. Lieber Griever,

    $string = "hier sind die dinger [n1] und noch eins [n2]";

    folgendes zurückgegeben wird:

    Array {
            [0] => "[n1]";
            [1] => "[n2]";
    }

    das <http://de.selfhtml.org/javascript/objekte/string.htm#match@title=SELFHTML-Beispiel zu String.match()> sollte Dir bei Deiner Funktion weiterhelfen. Achte insbesondere auf die Schleife...!

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Lieber Griever,

      $string = "hier sind die dinger [n1] und noch eins [n2]";

      folgendes zurückgegeben wird:

      Array {
              [0] => "[n1]";
              [1] => "[n2]";
      }

      das <http://de.selfhtml.org/javascript/objekte/string.htm#match@title=SELFHTML-Beispiel zu String.match()> sollte Dir bei Deiner Funktion weiterhelfen. Achte insbesondere auf die Schleife...!

      Liebe Grüße aus Ellwangen,

      Felix Riesterer.

      Du bist witzig.

      Wie ich die schleife mache, is mir klar. Aber wie ist der Reguläre ausdruck!?!?

      mit /\b[(a-z)]\b/ gehts nicht

      MFG
      Griever

      1. Lieber Griever,

        das <http://de.selfhtml.org/javascript/objekte/string.htm#match@title=SELFHTML-Beispiel zu String.match()> sollte Dir bei Deiner Funktion weiterhelfen. Achte insbesondere auf die Schleife...!

        ich hatte wohl unsinnigerweise den Focus auf die Schleife gelegt, dabei hätte der Hinweis auf den Modifier "g" hinter dem Ausdruck hinweisen sollen, der "global" suchen lässt, sodass Du überhaupt eine Schleife sinnvoll bauen kannst.

        mit /\b[(a-z)]\b/ gehts nicht

        Und mit dem "g" am Ende? /\b\[(a-z)\]\b/g

        Außerdem fällt mir auf, dass Du (a-z) notierst. Was soll das werden? Da Du die eckigen Klammern [] escapest, werden die Zeichen darinnen nicht als character class verstanden. Innerhalb der runden Klammern schon gleich garnicht. Die sind zum Merken da und merken sich genau das, was darinnen steht.

        /(a-z)/g findet also nur diese exakte Zeichenfolge "a-z" und merkt sich diese. Das, was Du willst, notiert man so: /[a-z]/g
        Wenn Du Dir das [a-z] merken möchtest, dann musst Du es in eine Parenthese setzen, also runde Klammern darum notieren: /([a-z])/g

        Da Deine Buchstaben ihrerseits in eckigen Klammern stehend gefunden werden sollen, brauchst Du diese natürlich auch, sonst findet Dein Ausdruck alles mögliche.

        Neuer Versuch: /\[[a-z]\]/g
        Jetzt findet dieser Ausdruck z.B. diese Vorkommen (ohne ihre Anführungszeichen): "[a]", "[x]", "[ß]" usw. Ich habe die runden Klammern deshalb nicht hinzugefügt, da diese nur innerhalb des Ausdrucks etwas bewirken, aber nicht das tun, was Du in PHP z.B. erwarten würdest (das gefunden-Array wird nicht automatisch mehrdimensional).

        Nach Deinem ersten Post denke ich, dass Du eigentlich so ziemlich alles finden willst, was zwischen eckigen Klammern steht, oder wieso steht oben etwas von "[meinsmiley]"? Also passt der Ausdruck sowieso noch nicht perfekt.

        Erneuter Versuch: /\[[^\]]+\]/g
        Hier suche ich nach einer öffnenden eckigen Klammer. Danach notiere ich eine Character Class, in der folgendes steht: "finde mir beliebig viele Zeichen, die keine schließende eckige Klammer sind", also in Kurzform "^]", jedoch muss diese schließende eckige Klammer natürlich noch escaped werden, da sie sonst die Character Class vorzeitig beendet, daher "^]". Das Pluszeichen nach der Character Class findet beliebig viele Vorkommen, mindestens jedoch eines.

        Fazit: Mit dem regulären Ausdruck /\[[^\]]+\]/g findest Du alle Vorkommen der Art [irgendwas1236-sdfhü&$!], allerdings immer mit den umgebenden eckigen Klammern dazu. Diese bekommst Du über den regulären Ausdruck selbst nicht gleich weg, das wirst Du im weiteren Scriptverlauf (z.B. in der Schleife!) machen müssen.

        Geprüftes Beispiel:

        function checkIt() {  
         var teststring, gefunden, i;  
          
         teststring = "Gesucht werden spezielle Smilies: [a1], [x], [a%d]";  
          
         gefunden = teststring.match(/\[[^\]]+\]/g);  
          
         alert("Anzahl Fundstellen: "+gefunden.length);  
          
         for (i in gefunden) {  
          alert(  
           "Fund " + i + ": '" + gefunden[i] + "'"  
           + "\n"  
           + "Smiley: '" + gefunden[i].replace(/[\[\]]/g, "") + "'"  
          );  
         }  
        }
        

        Liebe Grüße aus Ellwangen,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
        1. Also als allererstes ganz ganz dickes Dankeschön!

          So ne schöne Erklärung hab ich sonst noch nirgends gefunden.

          Bin jetzt um einiges Schlauer was Sachen POSIX-Reguläre Ausrücke angeht.

          Das mit dem, dass die Klammern mit übergeben werden, ist ok. Die krieg ich dann problemlos mit str_replace weg.

          Und du meintest, ich würde alles Mögliche in den Klammern suchen, ist falsch. Es dürfen nur Zeichen von a-z in Kleinbuchstaben vorkommen.

          Aber wirklich tausend Dank für deine umfangreiche, ausführliche und sehr aufschlussreiche Antwort.

          Wer das in der Form nich kapiert, sollte die Finger von Regulären Ausrücken lassen ^^

          (Bin voll happy *rumspring*)

          PS: Habe zwar derzeit nen anderes Script, was seinen Dienst erfüllt, aber ich glaub, ich werde das umstellen auf den regulären Ausdruck. Wenn du es mal sehen möchtest: http://fraggit.bplaced.de/ <<< wird in der Shoutbox verwendet. (muß man sich aber leider gottes registrieren. Aber keine Sorge. Is kostenlos, keine spammails oder sonst nen scheiss. Is nichmal große nervige Werbung auf der Seite)

          MFG
          Griever