Rainer: Regulärer Ausdruck

Hallo,
ich möchte in SSI den Dokumentennamen ohne das Suffix .html, .php etc. erhalten.
Dies habe ich u.a. mit

  
<!--#if expr="$DOCUMENT_NAME=/^(.*)\..*$/" -->  
   <!--#set var="DNAME" value="$1" -->  
<!--#endif -->

versucht.
Ergebnis ist aber z.B. bei Anton.php:
DNAME = "Anton.ph".
Was mache ich hier falsch?
Gruß
Rainer

  1. Hallo,

    ich möchte in SSI den Dokumentennamen ohne das Suffix .html, .php etc. erhalten.

    <!--#if expr="$DOCUMENT_NAME=/^(.*)..*$/" -->
       <!--#set var="DNAME" value="$1" -->
    <!--#endif -->
    versucht.
    Ergebnis ist aber z.B. bei Anton.php:
    DNAME = "Anton.ph".
    Was mache ich hier falsch?

    experimentell ermittelt, nicht aus der Doku: Dein Backslash wird als Maskierungszeichen ignoriert, sprich bei der Auswertung des Ausdrucks eliminiert. Dadurch hast Du:

    eine beliebig lange Folge von beliebigen Zeichen, die Du einfängst,
      gefolgt von genau einem beliebigen Zeichen,
      gefolgt von beliebig vielen, auch keinen beliebigen Zeichen.

    Wie kannst Du Dein Ziel erreichen? Maskiere den Backslash durch Verdoppelung:

    <!--#if expr="$DOCUMENT_NAME=/^(.*)\\..*$/" -->  
       <!--#set var="DNAME" value="$1" -->  
    <!--#endif -->  
    <!--#echo var="DNAME" -->
    

    Alternativ könntest Du auch nutzen, dass innerhalb einer Zeichenklasse der Punkt keine Sonderbedeutung hat:

    <!--#if expr="$DOCUMENT_NAME=/^(.*)[.].*$/" -->  
       <!--#set var="DNAME" value="$1" -->  
    <!--#endif -->  
    <!--#echo var="DNAME" -->
    

    Interessant finde ich, dass Deine Dateinamen mit einem Punkt enden dürfen.
    Wenn das nicht der Fall wäre, nähme ich der Klarheit wegen:

    eine beliebig lange Folge von beliebigen Zeichen, die Du einfängst,
      gefolgt von genau einem Punkt,
      gefolgt von beliebig vielen, mindestens einem beliebigen Zeichen,
      das nicht der Punkt ist:

    <!--#if expr="$DOCUMENT_NAME = /^(.*)[.][^.]+$/" -->

    Freundliche Grüße

    Vinzenz

    1. Hallo Vinzenz,

      experimentell ermittelt, nicht aus der Doku: Dein Backslash wird als Maskierungszeichen ignoriert, sprich bei der Auswertung des Ausdrucks eliminiert. Danke für die Hilfe.

      Wie Du schreibst "experimentell ermittelt" lt. meinen bisherigen Erfahrungen musste ein . im regulären Ausdruck mit einem \ maskiert werden.
      Hat jemand eine Erklärung, warum dies hier anders ist?
      Freundliche Grüße
      Rainer

      1. Hallo,

        experimentell ermittelt, nicht aus der Doku: Dein Backslash wird als Maskierungszeichen ignoriert, sprich bei der Auswertung des Ausdrucks eliminiert. Danke für die Hilfe.
        Wie Du schreibst "experimentell ermittelt" lt. meinen bisherigen Erfahrungen musste ein . im regulären Ausdruck mit einem \ maskiert werden.

        wie ich schon geschrieben habe: zwei Auswertungsrunden, siehe auch Doku, Variablen-Substitution:

        a) Auswertung der Zeichenkette in doppelten Anführungszeichen:
           Hierbei wird aus dem doppelten Backslash ein einfacher Backslash
        b) Auswertung des regulären Ausdrucks

        Sowas ist in $programmiersprache häufig anzutreffen.

        Ich habe Dir nicht umsonst eine Schreibweise empfohlen, die ohne Backslash auskommt.

        Freundliche Grüße

        Vinzenz

        1. Hallo,
          danke für die Erläuterung.
          Ich war nur über das "experimentell" gestolpert und hatte daraus geschlossen, dass es in der Doku irgendwie anders steht.
          Natürlich werde ich den Weg ohne Backslash wählen.
          Nochmals Dank
          Rainer