Ankündigung

Einklappen
Keine Ankündigung bisher.

Leichte Regex Modifikation von [] nach ()

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

  • Leichte Regex Modifikation von [] nach ()

    Hi,

    in meinen Script habe ich folgenden Regex, der hier tag ähnlich aus zwei Tags einen Link generiert:

    PHP-Code:
    $matches = array();
        
    preg_match_all('/\[([^\[\s]+?)\](.*?)\[\/\1\]/'$str$matchesPREG_SET_ORDER);
        foreach (
    $matches as $m) {
            if (
    defined($m[1])) {
                
    $link sprintf('<a href="%s">%s</a>'constant($m[1]), $m[2]);
                
    $str  str_replace($m[0], $link$str);
            }
        } 
    [LINK]TEST[/LINK]

    wird zu <a href="LINK">TEXT</a>

    Das klappt soweit ganz gut.

    Nun möchte das duplizieren für (LINK)TEST(/LINK), so dass er hier die Links in einem neuen Fenster öffnet.

    Leider klappt es nicht, wenn ich die [] jeweils durch () ersetze.

    Hoffe mir kann hier jemand helfen.

    Smilla


  • #2
    Doch das geht. Du musst aber zwischen [ ] und Zeichenklassen unterscheiden.
    --

    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


    --

    Kommentar


    • #3
      Hi,

      danke erst mal für die antworten, ich habe nun dies probiert:

      PHP-Code:
      preg_match_all('/\(([^\[\s]+?)\)(.*?)\(\/\1\)/'$str$matchesPREG_SET_ORDER); 
      Da die ( ) jeweils ein / vorher habem , müsste es eigentlich klappen, aber er tut es nicht

      Kommentar


      • #4
        Zitat von smilla Beitrag anzeigen
        Hi,

        danke erst mal für die antworten, ich habe nun dies probiert:

        PHP-Code:
        preg_match_all('/\(([^\[\s]+?)\)(.*?)\(\/\1\)/'$str$matchesPREG_SET_ORDER); 
        Da die ( ) jeweils ein / vorher habem , müsste es eigentlich klappen, aber er tut es nicht
        Der Regexp-Evaluator meint, es hätte geklappt ...

        "Tut es nicht" ist aber auch keine sonderlich hilfreiche Fehlerbeschreibung.

        Der Modifikator /x erlaubt das Einfügen von Leerzeichen und somit ist hilfreich, wenn man die Übersicht verloren hat, welche Klammerzeichen nur Klammerzeichen und welche Subpattern-Begrenzer sind. Noch besser wäre natürlich eine Art Syntax-Highlighting.

        Du willst so etwas ähnliches wie einen BBCode-Parser bauen? Dafür gibt es Fertigbauteile, die wesentlich besser funktionieren als eine selbstgestrickte Lösung (man denke nur an verschachtelte Tags und Ähnliches).

        Nachdem wir das geklärt hätten:

        PHP-Code:
        preg_match_all(
            
        '/ ( (\[) |\( ) (LINK) ((?(2) \] | \) )) (.*?) \1\/\3\4/x',
            
        $str$matchesPREG_SET_ORDER
        ); 
        Funktioniert für beides [LINK]...[/LINK] und (LINK)...(/LINK). Ersteres erkennt man man am gesetzten $matches[r][2] oder bei dir schlicht $m[2]. Der "Link-Text" steht in $m[5].
        Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

        Kommentar


        • #5
          Was macht denn "(?(2)" ? Wird nicht auch [LINK) und (LINK] möglich?
          --

          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


          --

          Kommentar


          • #6
            Zitat von nikosch Beitrag anzeigen
            Was macht denn "(?(2)" ? Wird nicht auch [LINK) und (LINK] möglich?
            Nein, genau das wird damit verhindert (zumindest war es so gedacht).

            (?(2) \] | \) ) heißt:
            * wenn Subpattern 2 gefunden wurde (die öffnende eckige Klammer),
            ** dann suche eine schließende eckige Klammer "\]"
            ** andernfalls suche eine schließende runde Klammer "\)"

            Die zusätzlichen runden Klammern drumherum "((?(2) \] | \) ))" sind dazu da,
            das Teilmuster "einzufangen", damit es dann am Ende per "back reference" "\4" wiedergefunden werden kann.

            Das Ganze ist sicher nicht schön, funktioniert aber.

            Und weil ich den Handbuchlink beim letzten Post vergessen habe, wird er hiermit nachgeliefert:

            Regexp Reference: Conditional Subpatterns
            Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

            Kommentar


            • #7
              Dankeschön. Wieder was gelernt! *bookmark*
              --

              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
              Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


              --

              Kommentar

              Lädt...
              X