stiller: preg_replace, Teilstring einsetzen

Hallo

Ich habe folgenden Text "Das ist ein LINK999TestlinkLINKOUT der verlinkt werden soll".

Mittels preg_replace suche ich die Kennwörter und ersetze sie durch a href->

  
$STRING_NEW = preg_replace('/LINK/', '<strong><a href="http://www.url.com/editorial.php?o=565" style="color:#851c0f;text-decoration:underline\"><u>', $STRING_NEW);  
$STRING_NEW = preg_replace('/LINKOUT/', '</u></a></strong>', $STRING_NEW);  

Nun suche ich eine Möglichkeit wie ich den dynamischen "Restwert" vom LINK, also im Beispiel 999 auslesen kann und dann im Link als Variable weitergeben kann. Die "999" sind dynamisch und variieren, ebenso der Linktext (Testpink). Gibt es eine Möglichkeit via regulärem Ausdruck diesen Wert zu verarbeiten?

Danke für eure Hilfe.

Gruss
Stiller

  1. Nun suche ich eine Möglichkeit wie ich den dynamischen "Restwert" vom LINK, also im Beispiel 999 auslesen kann und dann im Link als Variable weitergeben kann. Die "999" sind dynamisch und variieren, ebenso der Linktext (Testpink). Gibt es eine Möglichkeit via regulärem Ausdruck diesen Wert zu verarbeiten?

    Die Suchergebnisse stehen dir im Replacement zur verfügung (0 ist alles, 1 ist das erste Subpattern usw) - steht in der Dokumentation ;)

    Wenn du etwas komplexeres beim "weiterverarbeiten" vorhast, könnte preg_replace_callback interessant werden,

    In deinem Fall scheinst du aber nur LINK999LINKOUT durch

    <strong><a href="http://www.url.com/editorial.php?o=999" style="color:#851c0f;text-decoration:underline"><u>999</u></a></strong>

    oder ähnliches erstetzen zu wollen - das ist mit preg_replace kein Problem. Allerdings sollest du dein HTML überdenken und die Formatierung lieber in CSS auslagern als damit dein Dokument zuzumüllen.

    1. Lieber suit,

      Die Suchergebnisse stehen dir im Replacement zur verfügung (0 ist alles, 1 ist das erste Subpattern usw) - steht in der Dokumentation ;)

      bist Du gerade bei preg_match? Der OP hat preg_replace verwendet.

      Liebe Grüße,

      Felix Riesterer.

      --
      ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
      1. Die Suchergebnisse stehen dir im Replacement zur verfügung (0 ist alles, 1 ist das erste Subpattern usw) - steht in der Dokumentation ;)

        bist Du gerade bei preg_match? Der OP hat preg_replace verwendet.

        Nein, ich bin schon bei preg_replace:

        2. Argument: replacement; may contain references of the form \n or [...] $n; n can be from 0 to 99, and [0] refers to the text matched by the whole pattern. Opening parentheses are counted from left to right (starting from 1) to obtain the number of the capturing subpattern.

  2. Lieber stiller,

    so gerne ich preg_replace für solche Sachen verwende, sosehr ist es dafür eigentlich nicht gedacht.

    Ich habe folgenden Text "Das ist ein LINK999TestlinkLINKOUT der verlinkt werden soll".

    Du suchst ("match") nach zwei Elementen in einer Zeichenkette:

    1.) eine dreistellige Zahl (lassen wir sie auch gerne x-stellig sein)
    2.) einem Wort an einer bestimmten Stelle

    Probieren wir das einmal mit der Funktion preg_match:

    $o = '';  
    $l = '';  
    $s = 'Das ist ein LINK999TestlinkLINKOUT der verlinkt werden soll';  
    $link = $s;  
      
    if (false !== preg_match('~LINK(\d+)(\w+)LINKOUT~', $s, $found)) {  
      
        $o = $found[1];  
        $l = $found[2];  
      
        // create clickable link  
        $link = sprintf(  
            '<a class="linkout" href="http://example.com/editorial.php?o=%1$d">%2$s</a>',  
            $o,  
            htmlspecialchars($l)  
        );  
    }
    

    Das mit preg_match hatte wohl suit auch gemeint...

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. so gerne ich preg_replace für solche Sachen verwende, sosehr ist es dafür eigentlich nicht gedacht.

      Doch, genau dafür ist preg_replace gedacht ;)

      Ich habe folgenden Text "Das ist ein LINK999TestlinkLINKOUT der verlinkt werden soll".

      Du suchst ("match") nach zwei Elementen in einer Zeichenkette:

      1.) eine dreistellige Zahl (lassen wir sie auch gerne x-stellig sein)
      2.) einem Wort an einer bestimmten Stelle

      Probieren wir das einmal mit der Funktion preg_match:

      $o = '';

      $l = '';
      $s = 'Das ist ein LINK999TestlinkLINKOUT der verlinkt werden soll';
      $link = $s;

      if (false !== preg_match('~LINK(\d+)(\w+)LINKOUT~', $s, $found)) {

      $o = $found[1];
          $l = $found[2];

      // create clickable link
          $link = sprintf(
              '<a class="linkout" href="http://example.com/editorial.php?o=%1$d">%2$s</a>',
              $o,
              htmlspecialchars($l)
          );
      }

      
      >   
      > Das mit preg\_match [hatte wohl suit auch gemeint](https://forum.selfhtml.org/?t=215507&m=1476071)...  
        
      Nein, hatte ich nicht - deine Krücke mit sprintf + preg\_match kannst du in diesem Fall sparen, für genau diesen Fall gibt es preg\_replace  
        
      ~~~php
      <?php  
        $string      = 'Das ist ein LINK999TestlinkLINKOUT der verlinkt werden soll';  
        $pattern     = '~LINK(\d+)(\w+)LINKOUT~';  
        $replacement = '<a class="linkout" href="http://example.com/editorial.php?o=\1">\2</a>';  
        echo preg_replace($pattern, $replacement, $string);  
      ?>
      

      \d+ matcht auf eine Dezimalziffernfolge - also besteht keine Gefahr, dass hier irgendwas daherkommt was den Link kaputt macht; \w+ < > " ' oder & sind für PCRE keine Word-Zeichen (egal wie absurd die locale-Einstellungen grade sind), also auch hier gibts keine Probleme - das htmlspecialchars() ist hier also auch nicht notwendig.

      Wer allerdings kein UTF-8-Dokument verschickt kann ggf. mit Zeichen oberhalb #128 Probleme bekommen, wenn das das verwendete Encoding nicht kann. Ggf. braucht man hier dann ein htmlentities() oder aber ein preg_replace_callback