Ralf: String mit Funktionsaufruf interpretieren (2)

Hallo!

Ich hoffe mal, dass ich mit einem neuen Thread trotz des gleichen Subjects wie gestern richtig liege, weil es um ein spezielles Problem geht, welches die von Struppi angebotene Lösung in folgendem Beitrag nun "verursacht hat:
https://forum.selfhtml.org/?t=143574&m=932230

Hier zunächst der Code (welcher auch funktioniert):

String.prototype.resolve= function()  
{  
    var new_string = this.replace( /\[\[\[([^\]]*)\]\]\]/g, get_attr ("$1") );  
    return new_string;  
}  
function get_attr(s)  
{  
    return "*" + s + "*";  
}  
  
var string = "abc [[[var1]]] def [[[var2]]] xyz";  
alert( string.resolve( ) );

Es soll erreicht werden, dass für Strings, die mit 3-fachen eckigen Klammern umgeben sind, ein Wert ermittelt wird, der vom jeweiligen String abhängt.

Mein Problem ist nun, dass innerhalb der Funktion get_attr() kein Zugriff auf den "wahren" Wert von "s" möglich ist. Wenn ich alert(s) einsetze, wird "$1" angezeigt. Die Funktion soll aber einen Wert abhängig von "s" zurückgeben ...

Mache ich einen Denkfehler?

Ralf

  1. Mein Problem ist nun, dass innerhalb der Funktion get_attr() kein Zugriff auf den "wahren" Wert von "s" möglich ist. Wenn ich alert(s) einsetze, wird "$1" angezeigt. Die Funktion soll aber einen Wert abhängig von "s" zurückgeben ...

    Mache ich einen Denkfehler?

    scheint nicht so zu sein, ich bin aber auch überrascht und hab jetzt keine Lösung, da muss wohl ein Fachmann ran.

    Struppi.

    --
    Javascript ist toll (Perl auch!)
    1. Mache ich einen Denkfehler?

      scheint nicht so zu sein, ich bin aber auch überrascht und hab jetzt keine Lösung, da muss wohl ein Fachmann ran.

      Ich habe noch mal drüber nachgedacht. Rein der Syntax nach wird ja auch nur "$1" als Konstante übergeben. Warum sollte in der Funktion ein anderer Wert auftauchen? Die Ersetzung findet nur intern in replace() statt.

      Genau deinen Ansatz mit replace() hatte ich zuvor schon verworfen, weil ich keinen Zugriff auf die Ergebnisse bei mehreren Ersetzungen hatte. Dann bin ich zum einen auf match() gekommen, dessen Ergebnisse ich dann in einer Schleife durchlaufen kann und zum anderen habe ich hier im Forum gefragt, ob es denn nicht auch einfacher geht.

      Immerhin ist dabei die Sache mit prototype für mich als Erkenntnis hängengeblieben und vielleicht hat ja noch jemand einen anderen Ansatz parat.

      Ralf

  2. Hallo Ralf.

    Mein Problem ist nun, dass innerhalb der Funktion get_attr() kein Zugriff auf den "wahren" Wert von "s" möglich ist. Wenn ich alert(s) einsetze, wird "$1" angezeigt. Die Funktion soll aber einen Wert abhängig von "s" zurückgeben ...

    Ein und dasselbe Problem hatten wir hier schon einmal behandelt und soweit ich mich erinnern kann, war ich an diesem Thread auch beteiligt. Leider kann ich ihn momentan nicht wiederfinden …

    Einen schönen Dienstag noch.

    Gruß, Mathias

    --
    ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
    debian/rules
  3. Hallo Ralf.

    Mein Problem ist nun, dass innerhalb der Funktion get_attr() kein Zugriff auf den "wahren" Wert von "s" möglich ist. Wenn ich alert(s) einsetze, wird "$1" angezeigt. Die Funktion soll aber einen Wert abhängig von "s" zurückgeben ...

    Besagten Thread konnte ich zwar nicht mehr finden, dafür aber eine mögliche Lösung:

    var s = "Foo Bar Baz Qux";  
      
    function highlightA(str, match) {  
      
      return '*' + match + '*';  
    }  
      
    alert(s.replace(/(a)/g, highlightA)); //Foo B*a*r B*a*z Qux
    

    Einen schönen Dienstag noch.

    Gruß, Mathias

    --
    ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
    debian/rules
    1. Besagten Thread konnte ich zwar nicht mehr finden, dafür aber eine mögliche Lösung:

      var s = "Foo Bar Baz Qux";

      function highlightA(str, match) {

      return '' + match + '';
      }

      alert(s.replace(/(a)/g, highlightA)); //Foo Bar Baz Qux

        
      Klasse, das dürfte die Lösung sein.  
      Das ich da nicht drauf gekommen bin?  
        
      Struppi.
      
      -- 
      [Javascript ist toll](http://javascript.jstruebig.de/) (Perl auch!)
      
    2. Hallo Mathias,

      Besagten Thread konnte ich zwar nicht mehr finden, dafür aber eine mögliche Lösung:

      var s = "Foo Bar Baz Qux";

      function highlightA(str, match) {

      return '' + match + '';
      }

      alert(s.replace(/(a)/g, highlightA)); //Foo Bar Baz Qux

        
      Dann werde ich mich mal morgen mit dem verlinkten Artikel befassen und das in meinem Projekt umsetzen.  
        
      Vielen Dank!  
        
      Ralf