Strings ersetzen mit Regex

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Strings ersetzen mit Regex

    Moin Moin,

    bin neu hier und hab ein kleines Regex Problem. Hoffe mir kann da jemand helfen.

    Ich möchte aus einem PHP-Code mittels preg_replace, Strings mit einfachen Anführungszeichen ersetzen lassen.

    Also so etwas:
    PHP-Code:
    $string 'Das ist
    ein String über 
    mehrere Zeilen'

    Jetzt möchte ich alles zwischen ' und ' suchen lassen. Das ist auch kein Problem, aber jetzt kommt der schwere Teil.
    Das soll er nur machen, wenn der Teil nicht zwischen " und " steht.

    Also so z.B.:
    PHP-Code:
    $string "'"// soll nicht erkannt werden
    $string "Das ist ein String mit einem ' darin"
    // Jetzt würde er mit preg_replace bei dem ' anfangen. 
    // Das soll er aber nicht, weil es zwischen " und " steht 
    Mein Ansatz ist bis jetzt folgender:
    PHP-Code:
    $code preg_replace("#(?<!\")('.*?')(?!\")#is"'<span style="color:#CC0000;">$1</span>'$code); 
    Das funktioniert aber nur wenn die Zeichen direkt davor und dahinter sind und nicht wenn es irgendwo dazwischen steht.

    Ich hoffe man versteht was ich meine...

    Gruß
    Riddler
    Zuletzt geändert von Riddler; 07.10.2008, 13:51.

  • #2
    Und was spricht gegen ein simples
    Code:
    /^'([^']+)'$/
    ?

    (Funktioniert natürlich nicht, wenn der Single-Qouted-String selbst Teil eines Strings ist.)

    Grüße
    Zuletzt geändert von Griecherus; 07.10.2008, 11:58.
    Nieder mit der Camel Case-Konvention

    Kommentar


    • #3
      oder das: /'(.*)'/is

      Kommentar


      • #4
        Danke aber das funzt leider nicht.

        Um mal ein einfaches Beispiel zu machen.
        Ich habe folgenden Text und möchte jetzt ein Pattern haben, was die grün markierten Stellen findet und als Backreference zurück gibt.

        [COLOR=green]'Das ist ein Text'[/COLOR]
        "Das ist ein [COLOR=red]'Text'[/COLOR] mit Single Quotes"
        [COLOR=green]'Das ist ein "Text" mit Double Quotes'[/COLOR]
        [COLOR=green]''[/COLOR]
        "[COLOR=red]'[/COLOR]"

        Also im Prinzip möchte ich alle Stellen finden, die zwischen Single Quotes stehen inklusive selbiger.
        Das aber nur wenn diese Stelle nicht zwischen zwei Double Quotes steht.

        Mit meinem Pattern klappt das zwar, aber nur bei "'" und nicht bei bespielsweise " ' ".

        Gruß
        Riddler

        Kommentar


        • #5
          Und genau das macht mein Pattern (oder ich verstehe dich falsch).

          Grüße
          Nieder mit der Camel Case-Konvention

          Kommentar


          • #6
            Nein leider nicht.
            Habs mit dem Regex-Tester und meinem Beispiel Text probiert.
            Leider keine Treffer...
            Und das rot markierte in meinem Beispiel soll auch nicht gefunden werden.

            Kommentar


            • #7
              [COLOR=green]'Das ist ein Text'[/COLOR]
              -> Check

              "Das ist ein [COLOR=red]'Text'[/COLOR] mit Single Quotes"
              -> Check

              [COLOR=green]'Das ist ein "Text" mit Double Quotes'[/COLOR]
              -> Check

              [COLOR=green]''[/COLOR]
              -> Mach aus [^']+ ein [^']*, dann klappt auch das

              "[COLOR=red]'[/COLOR]"
              -> Check

              Wo ist das Problem?
              Nieder mit der Camel Case-Konvention

              Kommentar


              • #8
                Habs mit dem Regex-Tester und meinem Beispiel Text probiert.
                Benutz doch bitte den http://Regexp-Evaluator.de vom Hund, da kannst du deine Ergebnisse auch verlinken.

                Kommentar


                • #9
                  @TobiaZ
                  werd ich machen

                  @Griecherus
                  Wenn ich das zeilenweise teste dann geht das schon, aber ich möchte das ja auf den ganzen Text anwenden, auch über mehrere Zeilen hinweg und da gehts leider nicht mehr...

                  Siehe hier

                  Kommentar


                  • #10
                    OK, das hätte natürlich als Anforderung erwähnen können.
                    Das macht das Ganze komplizierter. Eine Regex, die das ohne Weiteres löst, kommt mir spontan nicht in den Sinn. Du könntest es aber auch über Umwege lösen.
                    Was mir spontan einfällt:
                    - alle Zeichenfolgen, die in Double-Quotes stehen, entfernen, damit dürften dann nur noch "gültige" Single-Quoted Strings übrig bleiben

                    - oder String Zeichen für Zeichen parsen, bei Vorkommen eines Double-Quotes Flag setzen und Single-Quotes ignorieren, bis schließendes Double-Quote gefunden wurde

                    P.S. Bitte Überbreite deines ersten Postings korrigieren.


                    Grüße
                    Nieder mit der Camel Case-Konvention

                    Kommentar


                    • #11
                      Ich hab mal auf die Schnelle etwas zusammengeschustert:
                      PHP-Code:

                      // Zustand: in single-quotes
                      $in_sq false;
                      // Zustand: in double-quotes
                      $in_dq false;

                      foreach (
                      str_split($str) as $chunk)
                      {
                          switch (
                      $chunk)
                          {
                              case 
                      '"':
                                  
                      $in_dq = ($in_dq === false) ? true false;
                                  break;
                          
                              case 
                      "'":    
                                  
                      $in_sq = ($in_sq === false) ? true false;
                                  break;
                                  
                              default:
                              
                                  if ((
                      $in_sq === true) and ($in_dq === false))
                                  {
                                      
                      // Zustand: Zeichenfolge in single-quotes, die
                                      // nicht von double-quotes umgeben ist
                                  
                      }
                          }

                      Ist sicherlich nicht elegant, sollte aber funktionieren.
                      Nieder mit der Camel Case-Konvention

                      Kommentar


                      • #12
                        versuch das mal:

                        PHP-Code:
                        preg_match_all("|\'(.*)\'|U",$string,$ausgabePREG_SET_ORDER); 
                        Damit habe ich zuletzt erfolgreich genau das bewirkt, was du beschreibst.

                        Im Prinzip müsste in $ausgabe[0][0] das stehen was du brauchst.

                        Kommentar


                        • #13
                          Original geschrieben von Riddler
                          Danke aber das funzt leider nicht.

                          Um mal ein einfaches Beispiel zu machen.
                          Ich habe folgenden Text und möchte jetzt ein Pattern haben, was die grün markierten Stellen findet und als Backreference zurück gibt.

                          [COLOR=green]'Das ist ein Text'[/COLOR]
                          "Das ist ein [COLOR=red]'Text'[/COLOR] mit Single Quotes"
                          [COLOR=green]'Das ist ein "Text" mit Double Quotes'[/COLOR]
                          [COLOR=green]''[/COLOR]
                          "[COLOR=red]'[/COLOR]"

                          Also im Prinzip möchte ich alle Stellen finden, die zwischen Single Quotes stehen inklusive selbiger.
                          Das aber nur wenn diese Stelle nicht zwischen zwei Double Quotes steht.

                          Mit meinem Pattern klappt das zwar, aber nur bei "'" und nicht bei bespielsweise " ' ".

                          Gruß
                          Riddler
                          Ach sorry mein Beispiel greift nicht hier:
                          "Das ist ein [COLOR=red]'Text'[/COLOR] mit Single Quotes"

                          Kommentar


                          • #14
                            Sorry für spamming, aber ich habe da noch eine Idee:

                            PHP-Code:
                            preg_match_all("|\"(.*)\"|U",$string,$ausgabeDoublePREG_SET_ORDER);
                            preg_match_all("|\'(.*)\'|U",$string,$ausgabeSinglePREG_SET_ORDER);

                            if (
                            strpos($ausgabeDouble[0][1],$ausgabeSingle[0][1])===false){
                                
                            //Text in Single Quotes befindet sich nicht im String mit Double Quotes
                            }else{
                                
                            //Verwerfen

                            (Die SingleQuotes maskieren, wird hier vom Parser weggeschnitten)
                            Würde mich mal interessieren, ob das was wert ist.
                            Zuletzt geändert von alex2iceman; 08.10.2008, 09:15.

                            Kommentar


                            • #15
                              Original geschrieben von alex2iceman
                              Ach sorry mein Beispiel greift nicht hier:
                              "Das ist ein [COLOR=red]'Text'[/COLOR] mit Single Quotes"
                              Soller auch gar nicht, oder? Ist doch rot satt grün markiert.

                              Kommentar

                              Lädt...
                              X