Meowsalot: User direkt ansprechen und abspeichern

Hallo alle,

ich habe ein kleines Problem. Auf meiner Seite können User sich untereinander Nachrichten schicken. Diese werden so abgespeichert

if(isset($_POST['abschicken_nachricht'])){

    if ($stmt = $mysqli->prepare("INSERT INTO nachrichten (tID, userID, nachricht) 
                                      VALUES (?, ?, ?)"))
       { 
        
        $tID      	 = $_GET['code'];
        $userID      = $UserDaten->userCode;
        $nachricht   = $_POST["nachricht"];

        $stmt->bind_param("sss", $tID, $userID, $nachricht);
        
        $stmt->execute();
        }
    else {
          echo $mysqli -> error;
    }
}

Klappt aus. Jetzt kann in $_POST["nachricht"] z.B. so etwas stehen:

Ich bin ein Test. @Test1 ist die Nachricht bei dir angekommen? @Test2 kannst du bitte noch ein Wasser mitbringen?

Jetzt kommt ein Problem wo ich nicht weiß wie ich es lösen kann. Wenn ein User direkt mit @ angesprochen wird, soll in eine weitere Tabelle ein Insert geschrieben werden. Das Insert ist kein Problem nur wie kann ich mit PHP Herausfinden ob ein User angesprochen wird? Das zweite Problem ich weiß nicht, wie viele User in einer Nachricht angesprochen werden.

Ich hoffe ihr versteht mein Problem?

Noch eine letzte Frage meinen Variablen z.B.

$tID = $_GET['code'];

Ich könnte in diesem Beispiel $_GET['code'] direkt an $stmt->bind_param übergeben. Wann ist es sinnvoll dieses zu tun bzw. wann ist es sinnvoll erst eine Variable anzulegen und diese dann an $stmt->bind_param zu übergeben?

Bis bald!
Meowsalot (Bernd)

akzeptierte Antworten

  1. Hallo,

    du musst das wahrscheinlich so ähnlich wie hier im Forum machen: https://github.com/ckruse/cforum/blob/master/app/helpers/mentions_helper.rb

    Viele Grüße.

    1. Hallo Regina,

      damit komme ich nicht zurecht. Schaut für mich auch nicht wie nach PHP aus? Ich dachte eher an so etwas?

      https://www.script-example.com/php-suchstring

      Nur ich weiß nicht, wie ich dieses auf meinen Code anwenden kann.

      Bis bald!
      Meowsalot (Bernd)

  2. Tach!

    Jetzt kommt ein Problem wo ich nicht weiß wie ich es lösen kann. Wenn ein User direkt mit @ angesprochen wird, soll in eine weitere Tabelle ein Insert geschrieben werden. Das Insert ist kein Problem nur wie kann ich mit PHP Herausfinden ob ein User angesprochen wird? Das zweite Problem ich weiß nicht, wie viele User in einer Nachricht angesprochen werden.

    Für beide Themen überleg dir erstmal in natürlicher Sprache, was du zu erreichen versuchst. Wenn du diesen Text auf Papier hast, wie ermittelst du den Nutzernamen? Vermutlich suchst du ein Vorkommen von @ und liest dann alles nachfolgende bis ein Zeichen folgt, das kein Buchstabe oder eine Zahl ist. Das schließt aus, dass Nutzer Leerzeichen im Namen haben können. Aber dann kann man sich eine andere Lösung ausdenken. Die Liste der Namen ist ja bekannt, also kannst du die Nutzer namen mit dem Text nach dem @ vergleichen, dann natürlich mit dem restlichen Text inklusive dem Teil nach dem ersten Whitespace. Wenn du gut bist, denkst du an Dinge wie Foo und Foobar, dass die längste Übereinstimmung zuerst gefunden wird. Also Nutzernamen rückwärts sortieren.

    Die Anzahl der Nutzer ergibt sich aus dem Resultat der ersten Frage. Nach jedem @ gehst du die Prozedur durch und findest entweder einen Nutzer oder keinen. Am Ende hast du eine Liste der angesprochenen Nutzer und damit auch deren Anzahl.

    Noch eine letzte Frage meinen Variablen z.B.

    $tID = $_GET['code'];
    

    Ich könnte in diesem Beispiel $_GET['code'] direkt an $stmt->bind_param übergeben. Wann ist es sinnvoll dieses zu tun bzw. wann ist es sinnvoll erst eine Variable anzulegen und diese dann an $stmt->bind_param zu übergeben?

    Extra Variablen sind nie eine gute Idee, wenn du dafür keine Begründung geben kannst. Die Begründung kann auch auf Wissen mit Verbesserungspotenzial basieren, aber das ist eine andere Geschichte.

    Möchte denn das bind_param von mysqli mit Array-Einträgen zusammenarbeiten? Wenn ja, dann gibt es keine Grund für eine weitere Variable. Wenn nicht, wäre zu überlegen, ob man nicht auf PDO umsteigt, denn das ist verwenderfreundlicher, weil es diese starre Bindung nicht braucht. Dem kann man ganz locker ohne vorheriges Binden ein Array im Execute übergeben.

    dedlfix.

    1. Hallo dedlfix,

      Für beide Themen überleg dir erstmal in natürlicher Sprache, was du zu erreichen versuchst. Wenn du diesen Text auf Papier hast, wie ermittelst du den Nutzernamen? Vermutlich suchst du ein Vorkommen von @ und liest dann alles nachfolgende bis ein Zeichen folgt, das kein Buchstabe oder eine Zahl ist. Das schließt aus, dass Nutzer Leerzeichen im Namen haben können. Aber dann kann man sich eine andere Lösung ausdenken. Die Liste der Namen ist ja bekannt, also kannst du die Nutzer namen mit dem Text nach dem @ vergleichen, dann natürlich mit dem restlichen Text inklusive dem Teil nach dem ersten Whitespace. Wenn du gut bist, denkst du an Dinge wie Foo und Foobar, dass die längste Übereinstimmung zuerst gefunden wird. Also Nutzernamen rückwärts sortieren.

      genau, ich möchte nach einem @ Zeichen suchen und dann was dahinter kommt bis zu einem Leerzeichen schnappen und die die extra Tabelle schreiben. Der Text, der dem User mitgeteilt wird benötige ich nicht. Mir geht es in diesem Fall wirklich nur nach dem User. Auch spielt erst einmal keine roll ob der User in meiner Datenbank vorhanden ist oder nicht.

      Bis bald!
      Meowsalot (Bernd)

      1. Tach!

        genau, ich möchte nach einem @ Zeichen suchen und dann was dahinter kommt bis zu einem Leerzeichen schnappen und die die extra Tabelle schreiben.

        Dann mach genau das. Du hast da also ein Muster: Ein @, welches nicht Bestandteil des Ergebnisses sein soll, dann Buchstaben und Ziffern (oder auch noch mehr Zeichen), die Bestandteil des Ergebnisses sein sollen, gefolgt von einem Leerzeichen. Man könnte auch sagen, alles nach dem @, was kein Leerzeichen ist. Das schließt eine Menge Zeichen mit ein, die man aber eventuell auch nicht haben möchte. Zudem wird wohl Whitespace statt Leerzeichen die passendere Trennung sein. Damit solltest du schon mal einen Regulären Ausdruck formulieren können. Der Teil "ist Bestandteil des Ergebnisses" lässt sich einfach mit einer Gruppierung lösen.

        dedlfix.

        1. Hallo dedlfix,

          Damit solltest du schon mal einen Regulären Ausdruck formulieren können. Der Teil "ist Bestandteil des Ergebnisses" lässt sich einfach mit einer Gruppierung lösen.

          das ist leider leichter geschrieben als umgesetzt vor allem wenn man davon keine Ahnung hat. Auf der Seite https://www.php-einfach.de/php-tutorial/regulaere-ausdruecke/ finde ich nichts passendes was ich für mein Problem nutzen könnte.

          Bis bald!
          Meowsalot (Bernd)

      2. genau, ich möchte nach einem @ Zeichen suchen und dann was dahinter kommt bis zu einem Leerzeichen schnappen

        Hallo @Meowsalot!

        Obige Zeile zeigt, warum das nicht sinnvoll ist. Tatsächlich ist es die beste Idee, die Nutzer umgekehrt zu sortieren und nach diesen (die längeren also zuerst) mit dem vorangestellten @ zu suchen. Also zu erst nach @Meowsalot0815, dann nach @Meowsalot. Nach dem ersten Treffer aufhören.

        1. Hallo Regina,

          Hallo @Meowsalot!

          Obige Zeile zeigt, warum das nicht sinnvoll ist. Tatsächlich ist es die beste Idee, die Nutzer umgekehrt zu sortieren und nach diesen (die längeren also zuerst) mit dem vorangestellten @ zu suchen. Also zu erst nach @Meowsalot0815, dann nach @Meowsalot. Nach dem ersten Treffer aufhören.

          das ist natürlich blöde wenn dieses so ein User schreibt. Wenn ich jetzt auch noch prüfen muss ob der User in meiner Datenbank so steht, dann wird es ja immer noch komplizierter. Ich habe ja noch nicht mal mein erster Vorhaben hinbekommen.

          Bis bald!
          Meowsalot (Bernd)

          1. das ist natürlich blöde wenn dieses so ein User schreibt

            Nun ja. Dass, wenn sich ein "Andreas" angemeldet hat und nachfolgend ein anderer Andreas sich anmeldet ist es geradezu der Standardfall, dass der es mit "Andreas1982" versucht, wenn ihm angezeigt wird, dass ein "Andreas" schon da sei und der Name eineindeutig (Du willst ja Nachrichten "adressieren") sein soll und deswegen eben nicht verwendet werden kann. Millionen von Nicknamen in Foren und Mailadressen beweisen das.

            1. Hallo Regina,

              ich habe es jetzt so gelöst.

              $namen = array("Peter", "Hugo");
              
              $text = "Ich bin ein Test. @Peter ist die Nachricht bei dir angekommen? @Hugo kannst du bitte noch ein Wasser mitbringen?";
              
              preg_match_all("/@(\w+)/", $text, $matches, PREG_PATTERN_ORDER);
              
              foreach ($matches[1] as $value) {
              
              	if (in_array($value, $namen)) {
              	    echo $value . "<br>";
              	}
              
              }
              

              In $namen stehen alle User, die in meiner Datenbank sind. Unten prüfe ich bevor ich den Insert in die Tabelle machen ob der User, der gefunden wurde auch im Array steht.

              Bis bald!
              Meowsalot (Bernd)

              1. Ich hätte das etwa so gemacht:

                <?php
                
                header( "Content-Type: text/plain; charset=utf8" );
                $arNutzer = array(
                                   'Müller',
                                   'Müller0815'
                                 );
                
                $txt[0] = 'Hallo @Müller0815! Ich hoffe, Dir geht es gut!';
                $txt[1] = 'Hallo @müller! Ich hoffe, Dir geht es gut!';
                $txt[2] = 'Hallo @Waldmüller! Ich hoffe, Dir geht es gut!';
                $txt[2] = 'Hallo @Waldmüller, @Müller, Müller0815! Ich hoffe, Euch geht es gut!';
                
                
                $oUserSuche = new UserSuche( $arNutzer );
                
                foreach ($txt as $str) {
                    $arrFunde = $oUserSuche -> SucheIn( $str );
                    if ( count( $arrFunde ) ) {
                        echo '"' . implode(', ', $arrFunde) . '" in "' . $str . '" gefunden.' . "\n";
                    } else {
                        echo 'Kein Nutzer in "'. $str . '" gefunden.' . "\n";
                    }
                }
                
                class UserSuche {
                
                    public $arNutzer;
                
                    function __construct( $arNutzer ) {
                        rsort( $arNutzer );
                        $this -> arNutzer = $arNutzer;
                    }
                
                    function SucheIn( $txt ) {
                        $arrReturn = array();
                        $fsOld = false;
                        foreach ( $this -> arNutzer as $Nutzer ) {
                            $fs = stripos ( $txt, '@' . $Nutzer );
                            if ( false !== $fs && $fs != $fsOld ) {
                               $arrReturn[] = $Nutzer;
                               $fsOld = $fs;
                            }
                        }
                        return $arrReturn;
                    }
                }
                

                Ausgaben:

                "Müller0815" in "Hallo @Müller0815! Ich hoffe, Dir geht es gut!" gefunden.
                "Müller" in "Hallo @müller! Ich hoffe, Dir geht es gut!" gefunden.
                "Müller" in "Hallo @Waldmüller, @Müller, Müller0815! Ich hoffe, Euch geht es gut!" gefunden.
                
                1. Ich hätte das etwa so gemacht:

                  <?php
                  
                  header( "Content-Type: text/plain; charset=utf8" );
                  $arNutzer = array(
                                     'Müller',
                                     'Müller0815',
                                     'Pokémon'
                                   );
                  
                  $txt[] = 'Hallo @Müller0815! Ich hoffe, Dir geht es gut!';
                  $txt[] = 'Hallo @müller! Ich hoffe, Dir geht es gut!';
                  $txt[] = 'Hallo @Waldmüller! Ich hoffe, Dir geht es gut!';
                  $txt[] = 'Hallo @Waldmüller, @Müller, Müller0815! Ich hoffe, Euch geht es gut!';
                  $txt[] = 'Hallo @Pokémon! Ich hoffe, Dir geht es gut!';
                  
                  $oUserSuche = new UserSuche( $arNutzer );
                  
                  foreach ($txt as $str) {
                      $arrFunde = $oUserSuche -> SucheIn( $str );
                      if ( count( $arrFunde ) ) {
                          echo '"' . implode(', ', $arrFunde) . '" in "' . $str . '" gefunden.' . "\n";
                      } else {
                          echo 'Kein Nutzer in "'. $str . '" gefunden.' . "\n";
                      }
                  }
                  
                  class UserSuche {
                  
                      public $arNutzer;
                  
                      function __construct( $arNutzer ) {
                          rsort( $arNutzer );
                          $this -> arNutzer = $arNutzer;
                      }
                  
                      function SucheIn( $txt ) {
                          $arrReturn = array();
                          $fsOld = false;
                          foreach ( $this -> arNutzer as $Nutzer ) {
                              $fs = stripos ( $txt, '@' . $Nutzer );
                              if ( false !== $fs && $fs != $fsOld ) {
                                 $arrReturn[] = $Nutzer;
                                 $fsOld = $fs;
                                 # Weitere Reaktionen hier aufrufen
                              }
                          }
                          return $arrReturn;
                      }
                  }
                  
                  
                  

                  Ausgaben:

                  "Müller0815" in "Hallo @Müller0815! Ich hoffe, Dir geht es gut!" gefunden.
                  "Müller" in "Hallo @müller! Ich hoffe, Dir geht es gut!" gefunden.
                  Kein Nutzer in "Hallo @Waldmüller! Ich hoffe, Dir geht es gut!" gefunden.
                  "Müller" in "Hallo @Waldmüller, @Müller, Müller0815! Ich hoffe, Euch geht es gut!" gefunden.
                  "Pokémon" in "Hallo @Pokémon! Ich hoffe, Dir geht es gut!" gefunden.
                  
                  1. Für

                    $txt[] = 'Hallo @Waldmüller, @Müller, @Müller0815! Ich hoffe, Euch geht es gut!';
                    

                    gibt das:

                    "Müller0815, Müller" in "Hallo @Waldmüller, @Müller, @Müller0815! Ich hoffe, Euch geht es gut!" gefunden.
                    

                    aus. Die gefundenen Namen landen also im Array $arrFunde. stripos() findet die Namen auch bei fehlerhafter GROSS/klein-Schreibung und ist performanter als ein Regex. Darüber hinaus interessieren die eigentlichen Fundstellen keinen, sondern nur welcher Name gefunden wurde. Die Methode SucheIn() gibt also alle gefundenen Nutzer zurück - und nicht nur Einen. (Das war der Fehler)

                    Die Kapselung in das Objekt habe ich gemacht, damit ggf. bei mehreren Textstellen die Suche mehrfach durchgeführt werden kann ohne dass das Array mit den Nutzernamen jedes Mal neu "teuer" gelesen und sortiert werden muss.

  3. hi

    Ich bin ein Test. @Test1 ist die Nachricht bei dir angekommen? @Test2 kannst du bitte noch ein Wasser mitbringen?

    Ich würde das per @(\w+) matchen. Das trifft alle alphanumerischen Zeichen nach dem Klammeraffen und am Leerzeichen ist ein Word zuende. Mehrere Matches ergeben alle Namen in einem Array.

    MfG

    1. Hallo pl,

      also wenn ich dieses so anwende

      $text = "Ich bin ein Test. @T1 ist die Nachricht bei dir angekommen? @T2 kannst du bitte noch ein Wasser mitbringen?";
      
      $suche = "/[@(\w+)]/";
      
      if(preg_match($suche, $text)) {
         echo "Gefunden";
      } else {
         echo "Nicht gefunden";
      }
      

      Dann wird mit gesagt dass das Muster gefunden wird, was auch richtig ist. Nur wie komme ich jetzt an die Werte?

      Bis bald! Meowsalot (Bernd)

      1. $pattern = "/@(\w+)/";
        $text = "Ich bin ein Test. @Alfred ist die Nachricht bei dir angekommen? @Hugo kannst du bitte noch ein Wasser mitbringen?";
        
        preg_match_all("/@(\w+)/", $text, $matches);
        
        print_r($matches);
        
        Ausgabe:
        Array
        (
            [0] => Array
                (
                    [0] => @Alfred
                    [1] => @Hugo
                )
        
            [1] => Array
                (
                    [0] => Alfred
                    [1] => Hugo
                )
        
        )
        
        1. Hallo pl,

          danke! Aber warum einmal mit @ und einmal ohne @

          Bis bald!
          Meowsalot (Bernd)

          1. hi,

            danke! Aber warum einmal mit @ und einmal ohne @

            Das bewirkt die Klammerung des (\w+). Und im Übrigen steht das Alles in der Doku 😉

            MfG

            PS: WAs ich allerdings nicht gefunden habe, wie preg_match mit Umläuten umgeht. Das überlass' ich Dir.

            1. Hallo pl,

              wenn ich es hier teste http://rubular.com/r/KZgQC9PauD dann habe ich keine doppelten Namen?

              Und $matches müsste ich doch so ausgeben lassen können?

              foreach ($matches as $wert) {
                
              }
              

              Wenn ich es so auslese

              $i = 0;
              
              foreach ($matches as $wert) {
                echo $wert[$i] . "\n";
                $i++;
              }
              

              erhalte ich folgendes

              @Alfred
              Hugo

              ist nicht ganz richtig.

              Bis bald!
              Meowsalot (Bernd)

              1. Wie Du mit Doppelten Namen umgehst, musst Du selbst entscheiden.

                MfG

                1. Hallo pl,

                  doppelte Namen sind es ja nicht. Einmal mit @ und einmal ohne @ da sind für mich zweierlei Einträge.

                  Bis bald!
                  Meowsalot (Bernd)

                  1. hi

                    doppelte Namen sind es ja nicht. Einmal mit @ und einmal ohne @ da sind für mich zweierlei Einträge.

                    Schau in die Datenstruktur. Da ist das doch getrennt voneinander und dann siehst Du auch, wie Du darauf zugreifen musst, es ist das 2. Array im Array mit dem Index [1]

                    Doppelt Namen:

                    $text = "Ich bin ein Test. @Alfred ist die Nachricht bei dir angekommen? @Hugo kannst du bitte noch ein Wasser mitbringen? Und @Alfred schreib mal wieder!";
                    

                    Kommt ja vom Benutzer. Also auch überlegen.

                    MfG

                    1. Hallo pl,

                      danke für deine Hilfe. Aber es funktioniert nicht. Ich habe auch irgendwie das Gefühl du willst alles unnötig kompliziert machen mit einem zweiten Array usw...

                      Mein Versuch war

                      $text = "Ich bin ein Test. @Alfred ist die Nachricht bei dir angekommen? @Hugo kannst du bitte noch ein Wasser mitbringen?";
                      
                      preg_match_all("/@(\w+)/", $text, $matches, PREG_PATTERN_ORDER);
                      
                      $i = 0;
                      
                      for($i=0; $i<count($matches); $i++) {
                        echo $matches[$i].", ";
                        $i++;
                      }
                      

                      Bis bald!
                      Meowsalot (Bernd)

                      1. Tach!

                        danke für deine Hilfe. Aber es funktioniert nicht. Ich habe auch irgendwie das Gefühl du willst alles unnötig kompliziert machen mit einem zweiten Array usw...

                        Du könntest ja mal die Handbuchseite zu preg_match_all() lesen. Es geht hier nicht um kompliziert machen, sondern es ist der Arbeitsweise geschuldet, dass es so ist. Und das ist auch gut so.

                        Zum einen muss man bei …_all alle Fundstellen auflisten, also ein Array. Zum anderen arbeiten RegExp so, dass man mehrere Gruppierungen angeben kann. Jede davon bekommt ihr eigenes Array. Selbst wenn es nur eine Gruppierung ist. Dazu kommt noch die Gruppe 0, die die gesamte Fundstelle des Ausdruckt enthält. Macht zusammen ein Array für die Gruppen und darin ein Array für die Fundstellen der Gruppe.

                        Du brauchst in deinem Fall also das Array für die Gruppe 1, das du dir aus dem Array $matches mit $matches[1] nehmen kannst. Darüber kannst du dann mit foreach laufen und eine Zählvariable $i brauchst du dabei nicht.

                        dedlfix.

                        1. Hallo dedlfix,

                          vielen lieben Dank mal wieder für die Ausführliche Erklärung. So kapiere ich es auch was ich machen muss. Mein Ergebnis sieht wie folgt aus

                          $text = "Ich bin ein Test. @Pokémon ist die Nachricht bei dir angekommen? @Hugo kannst du bitte noch ein Wasser mitbringen?";
                          
                          preg_match_all("/@(\w+)/", $text, $matches, PREG_PATTERN_ORDER);
                          
                          print $matches[1][0]." <br> ".$matches[1][1]."\n";
                          
                          echo "<br><br>";
                          
                          foreach ($matches[1] as $value) {
                              echo $value . "<br>";
                          }
                          

                          Als Ergebnis erhalte ich

                          Pok
                          Hugo

                          dieses stimmt in diesem Fall auch. Habe ich alles richtig gemacht oder würdest du noch etwas verbessern?

                          Ich bin noch etwas verunsichert weil Gunnar meinte das kann zu Problemen führen. Siehst du dieses auch so?

                          Danke natürlich auch an PL und Regina für die Hilfe.

                          Bis bald!
                          Meowsalot (Bernd)

                          1. Hallo,

                            Als Ergebnis erhalte ich

                            Pok
                            Hugo

                            dieses stimmt in diesem Fall auch.

                            sicher?

                            Ich bin noch etwas verunsichert weil Gunnar meinte das kann zu Problemen führen.

                            Er bezog sich genau darauf…

                            Gruß
                            Kalk

                          2. Tach!

                            Ich bin noch etwas verunsichert weil Gunnar meinte das kann zu Problemen führen. Siehst du dieses auch so?

                            Wie du siehst, klappt der Pokémon nicht. \w geht nur vom lateinischen Grundalphabet aus. Wenn du mehr haben möchtest, musst du einen anderen Selektor nehmen, beispielsweise Unicode character properties. Die weniger gute Variante wäre, alle erlaubten Zeichen zusätzlich zu \w in einer Character Class anzugeben.

                            dedlfix.

                            1. Hallo dedlfix,

                              oh stimmt, auf @Pokémon habe ich gerade nicht geachtet bzw. hab es nicht weiter beachtet. Aber gut, das kann ich ja beim Anlegen prüfen ob irgendwelche Sonderzeichen im Namen stehen. Also da mache ich mir jetzt mal weniger die Sorgen.

                              Bis bald!
                              Meowsalot (Bernd)

                              1. Hallo Meowsalot,

                                oh stimmt, auf @Pokémon habe ich gerade nicht geachtet bzw. hab es nicht weiter beachtet. Aber gut, das kann ich ja beim Anlegen prüfen ob irgendwelche Sonderzeichen im Namen stehen. Also da mache ich mir jetzt mal weniger die Sorgen.

                                Kannst du, du kannst aber auch erst mal alles an Zeichen akzeptieren, weil eine Kontrolle auf unerlaubte Zeichen/Manipulationen, sollte sowieso immer noch irgendwo erfolgen, wer weiß was da so alles eingetragen wird.

                                Nimm alles.

                                #@.*\s#isU
                                

                                Hifreich ist vielleicht auch dieses Regex-Tutorial und der dortige Tester (mit deinem Beispiel bereits hinterlegt).

                                Weiterhin ist im Hinterkopf zu behalten, dass Regex eine schöne Sache sind, sofern keine sinnvolle Alternative durch bereits bestehende String/Array-Funktionen existiert. Die ehemalige Zeitschrift Internet Professional hatte damals mal einen aufwendigen Test gemacht(finde ich leider nicht mehr), wo ein erheblicher Performanceverlust bei massiver Einsetzung von Regex zum Vorschein kam.

                                Gruss
                                Henry

                            2. @@dedlfix

                              Wie du siehst, klappt der Pokémon nicht. \w geht nur vom lateinischen Grundalphabet aus. Wenn du mehr haben möchtest, musst du einen anderen Selektor nehmen, beispielsweise Unicode character properties.

                              Musst du nicht. Du kannst auch die Zeichenklasse \w ändern.

                              LLAP 🖖

                              --
                              „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
    2. @@pl

      Ich würde das per @(\w+) matchen. Das trifft alle alphanumerischen Zeichen nach dem Klammeraffen

      Falsch.

      LLAP 🖖

      --
      „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
      1. @Gunnar Bittersmann

        Ich würde das per @(\w+) matchen. Das trifft alle alphanumerischen Zeichen nach dem Klammeraffen

        Falsch.

        Geht einwandfrei, ich habs ausprobiert. MfG

        1. @@pl

          Ich würde das per @(\w+) matchen. Das trifft alle alphanumerischen Zeichen nach dem Klammeraffen

          Falsch.

          Geht einwandfrei, ich habs ausprobiert.

          Die Rechnung hast du wohl ohne den Würt gemacht. Und ohne Pokémon.

          LLAP 🖖

          --
          „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
          1. @Gunnar Bittersmann

            Ich würde das per @(\w+) matchen. Das trifft alle alphanumerischen Zeichen nach dem Klammeraffen

            Falsch.

            Geht einwandfrei, ich habs ausprobiert.

            Die Rechnung hast du wohl ohne den Würt gemacht. Und ohne Pokémon.

            Bei mir funktioniert das auch mit Ümläuten, falls es das war was Du meintest.

            MfG

            1. @@pl

              Ich würde das per @(\w+) matchen. Das trifft alle alphanumerischen Zeichen nach dem Klammeraffen

              Falsch.

              Geht einwandfrei, ich habs ausprobiert.

              Die Rechnung hast du wohl ohne den Würt gemacht. Und ohne Pokémon.

              Bei mir funktioniert das auch mit Ümläuten, falls es das war was Du meintest.

              preg_match('/@(\w+)/', '@Würt', $matches);
              print_r($matches); // Array ( [0] => @W [1] => W )
              
              preg_match('/@(\w+)/', '@Pokémon', $matches);
              print_r($matches); // Array ( [0] => @Pok [1] => Pok )
              

              Ah, mit modifier u:

              preg_match('/@(\w+)/u', '@Würt', $matches);
              print_r($matches); // Array ( [0] => @Würt [1] => Würt )
              
              preg_match('/@(\w+)/u', '@Pokémon', $matches);
              print_r($matches); // Array ( [0] => @Pokémon [1] => Pokémon )
              

              LLAP 🖖

              --
              „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
              1. @@Gunnar Bittersmann

                Bei mir funktioniert das auch mit Ümläuten, falls es das war was Du meintest.

                Ah, mit modifier u:

                @pl: Da du den modifier nirgends hier im Thread erwähnt hast, würde mich schon interessieren, wie du darauf kommst, dass das bei dir funktioniert hätte.

                LLAP 🖖

                --
                „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
  4. hallo

    Mal dahin gefragt:

    • Wer definiert denn den Usernamen?
    • Ist der Username ein Unikat? (hat er die Funktion einer ID?)
    • Aus welchem Zeichenvorrat ist der Username konstituiert?

    Im übrigen, Wenn User andere User anschreiben, tun sie das in einem Kontext, in welchem der angeschriebne User abgefragt werden kann. Das heisst, man kann einen Auswahldialog von anschreibbaren Usern ad hoc anbieten. Dabei kann man dann einen Code maschinell einsetzen, der sehr viel eindeutiger zu parsen ist, weil man nicht Namen verwendet die eventuell geändert werden können, sondern UserIDs.