reguläre ausdrücke ersetzen



  • hi,

    genau, der reguläre ausdruck scheint mein problem zu sein. das habe ich bisher zusammengebaut:

    function parse_urls($text)
    {
       $callback=create_function('$treffer','return \'<a href="\'.tep_href_link($treffer[0], $treffer[1]).\'">\'.$treffer[2].\'</a>\';');
    
       return preg_replace_callback("[LINK]([\d]+)\::([\d]+)\::([\d]+)[/LINK]","callback",$text);
    }
    

    der reguläre ausdruck ist nicht ganz korrekt. wäre cool wenn den jemand korrigieren könnte. der rest müsste klappten, kann es nur nicht testen, weil ich diese fehlermeldung erhalte:

    Warning: preg_replace_callback() [function.preg-replace-callback]: Unknown modifier

    Das beispiel aus der php manuel geht aber.

    Soviel kann da doch nicht falsch sein?

    phil



  • Hi,

    ich habe es nun geschafft, zumindest funktioniert es mit meinem beispiel. da ich meinen regulären kenntnissen nicht traue würde ich gerne wissen ob mein pattern so okay ist, oder in einigen fällen eventuell nicht funktioniert. meine links werden immer nach dem selben musster wie in der fragestellung aufgebaut.

    function callback($treffer)
      {
         return "<a href='" . href_link($treffer[1], $treffer[2]). "'>" .$treffer[3]. "</a>";
      }
    
    function parse_urls($text)
    {
       $pattern = "#[LINK](.*?)\::(.*?)\::(.*?)[/LINK]#";
       return preg_replace_callback($pattern,"callback",$text);   
    }
    

    phil



  • 1.) Ein regulärer Ausdruck fängt immer mit einem Delimiter an und hört damit wieder auf - z.B. mit # (du musst nur darauf achten, dass der Delimiter nicht im Pattern selbst vorkommt bzw. musst du ihn dann escapen):

    #[LINK]([\d]+)\::([\d]+)\::([\d]+)[/LINK]#
    

    Bin mir gerade nicht sicher, ob du : escapen musst, aber wenn dann beide, also :: oder \:\:
    \d match nur Ziffern, was du brauchst ist wohl eher . bzw. falls dann das :: dann Probleme macht [0-9a-zA-Z] o.ä.



  • War wohl zu langsam und habe auch noch einiges vergessen - wenn dein Replace aber so recht einfach aussieht, dann reicht wohl auch das, was Dasd geschrieben hat:

    $pattern = "#[LINK](.*?)\::(.*?)\::(.*?)[/LINK]#e";
    $replace = "'<a href=\"'.href_link('\\1','\\2').'\">\\3</a>'";
    preg_replace($pattern,$replace,$text);
    

    Kann sein, dass noch ein Fehler drinsteckt - aber kannst es ja einfach mal testen 🙂



  • hi,

    das geht soweit. ich hatte vorher meine callback funktion noch anders umgebaut:

    function callback($treffer)
    {
       // Linkseite bestimmten
       switch ($treffer[1])
       {
          case "FILENAME_DEFAULT":
          default:
             return "<a href='" . href_link(FILENAME_DEFAULT, $treffer[2]). "'>" . $treffer[3] . "</a>";
          break;
       }
    }
    

    Der erste Parameter stellt nämlich eine Konstante dar. Wenn ich einfach die Variable übergebe, funktioniert die Funktion href_link nicht richtig. Daher habe ich in meinem callback ein switch-case drinnen und erweiter den bei bedarf.

    Gibt es denn eine Möglichkeit einen parameter nicht als wert sondern als konstante zu übergeben? weil dann könnte ich auch deinen code verwenden.

    dann müsste nur die zeile:

    $replace = "'<a href=\"'.href_link('\\1','\\2').'\">\\3</a>'";

    irgendwie verändert werden. nur wie?

    phil



  • Du kannst in href_link (oder auch schon der der Parameter-Übergabe - also in $replace) die constant() Funktion verwenden 🙂



  • jo, habs nun. besten dank.

    phil



  • hi,

    ich hab mir dasselbe nochmal mit einer bild url gebaut:

    function parse_urls($text)
    {
       $pattern = "#[IMAGE](.*?)\::(.*?)\::(.*?)\::(.*?)\::(.*?)[/IMAGE]#e";
       $replace = "'<a href=\"'.tep_href_link(constant('\\1'),'\\2').'\">" . tep_image(IMAGE_SERVER . '\\5', '\\3') . "</a>'";
       $text = preg_replace($pattern,$replace,$text);
    
       return $text;
    }
    

    Ist ja richtig wuselig das zusammenzuflicken. bei der funktio tep_image habe ich die konstante IMAGE_SERVER nun statisch reingebaut. Eigentlich steht diese in \\ 4 drinnen, nur wenn ich

    $replace = "'<a href=\"'.tep_href_link(constant('\\1'),'\\2').'\">" . tep_image(constant('\\4') . '\\5', '\\3') . "</a>'";

    nehme, kommt immer die fehlermeldung:

    Warning: constant() [function.constant]: Couldn't find constant \4 in /srv/www/htdocs/domain.de/script.php on line 85

    in \\4 steht aber auch IMAGE_SERVER drinnen. ich habe keine Ahnung wieso es nicht geht.

    phil



  • hi,

    wenn ich

    $replace = "'<a href=\"'.tep_href_link(constant('\\1'),'\\2').'\">" . tep_image(constant('IMAGE_SERVER') . '\\5', '\\3') . "</a>'";

    schreibe, geht es ja auch. also denke ich das der fehler nur daran liegen kann, dass ich irgendwo ein ' oder " zuviel oder zu wenig habe.

    leider komme ich mit der syntax auch nicht ganz zurecht, da das replace pattern ja einen besondere aufbau hat und ich nicht mal eben wie sonst einfachen html code generieren lassen kann.

    wäre echt cool, wenn da jemand nen fehler sehen könnte,

    phil



  • hi,

    okay, habe das ding auseinder genommen um den aufbau zu verstehen. nun läuft es endlich 😉

    hätte mir nie vorstellen können, dass es sowas gibt:

    . '</a>'";

    aber nun läuft es immerhin. nochmal besten dank an alle. nun habe ich es verstanden.

    phil


Anmelden zum Antworten