Jan Entzminger: regexp preg_replace | html tag inhalte ändern

Hi.
Ich suche mit
preg_match_all("/(<([\w]+)[^>]*>)(.*)".$word."(.*)(</\2>)/", $html,
$matches);
alle meine Links aus nem Text heraus. Das klappt wunderbar nur will ich das
Zeugs nicht nur rausuchen sondern gleich ersetzen. Das wollte ich so machen:
foreach($glossary as $ID => $word)
{
   $search_pattern = "/(<([\w]+)[^>]*>)(.*)".$word."(.*)(</\2>)/";
   $replacement_pattern =
"/(<([\w]+)[^>]*>)(.*)"."&".$word."&"."(.*)(</\2>)/";
   preg_replace($search_pattern, $replacement_pattern, $html);
 }
Für jedes Glossarwort das in einem Link drinne steht soll er mir alles so
lassen nur das Glossarwort in ein &$word& ändern. Also einfach ein und &
davor und danach hinschreiben. Klappt aber leider nicht. Könnte mir bitte
jemand weiterhelfen. Danke
Gruß Jan Entzminger

  1. Hallo Jan,

    Für jedes Glossarwort das in einem Link drinne steht soll er
    mir alles so lassen nur das Glossarwort in ein &$word&
    ändern. Also einfach ein und & davor und danach hinschreiben.
    Klappt aber leider nicht.

    Na, das ist kein Wunder. Schau dir doch bitte nochmal die Doku
    zu http://php.net/preg_replace an. Die sagt zum zu
    ersetzenden Teil folgendes:

    Replacement may contain references of the form \n or (since
     PHP 4.0.4) $n, with the latter form being the preferred one.
     Every such reference will be replaced by the text captured by
     the n'th parenthesized pattern. n can be from 0 to 99, and
     \0 or $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.

    When working with a replacement pattern where a
     backreference is immediately followed by another number
     (i.e.: placing a literal number immediately after a matched
     pattern), you cannot use the familiar \1 notation for your
     backreference. \11, for example, would confuse
     preg_replace() since it does not know whether you want the
     \1 backreference followed by a literal 1, or the \11
     backreference followed by nothing. In this case the solution
     is to use ${1}1. This creates an isolated $1 backreference,
     leaving the 1 as a literal.

    RegEx-Pattern sind im zu ersetzenden Teil also fehl am Platze.
    Dort kannst du nur auf die Backticks aus dem vorher
    angewendeten RegEx verweisen, der Rest muss ein ganz
    gewoehnlicher String sein.

    Gruesse,
     CK

    --
    http://cforum.teamone.de/
    http://wishlist.tetekum.de/
    If God had meant for us to be in the Army, we would have been born with green, baggy skin.
    1. Hallo Jan,
      RegEx-Pattern sind im zu ersetzenden Teil also fehl am Platze.
      Dort kannst du nur auf die Backticks aus dem vorher
      angewendeten RegEx verweisen, der Rest muss ein ganz
      gewoehnlicher String sein.

      Gruesse,
      CK

      Ok. Soweit so gut. Danke erstmal. Da ich aber nciht so viel normal mit Regexp mache gleiche die Nächste Frage auf mein Beispeil hinterher. Hie rnochmals mein Beispiel:
      foreach($glossary as $ID => $word)
      {
         $search_pattern = "/(<([\w]+)[^>]*>)(.*)".$word."(.*)(</\2>)/";
         $replacement_pattern = "/$1."&".$word."&"/";
         preg_replace($search_pattern, $replacement_pattern, $html);
      }
      Wie kann ich das jetzt schreiben das er mir von dem gefunden link nur das wort "word" in "&word&" abändert. Für ein Beispiel wäre ich wirklich dankbar.

      Gruß Jan

      1. Hallo Jan,

        Wie kann ich das jetzt schreiben das er mir von dem gefunden
        link nur das wort "word" in "&word&" abändert. Für ein
        Beispiel wäre ich wirklich dankbar.

        Am einfachsten waere das hier:

        $str = str_replace($wort,'&'.$wort.'&',$str);

        Das umrandet dir alle Vorkommen von $wort mit &. Ueberigens ist
        es nicht unbedingt die feine englische Art, hier mit Fullquotes
        um sich zu werfen.

        Gruesse,
         CK

        --
        http://cforum.teamone.de/
        http://wishlist.tetekum.de/
        If God had meant for us to be in the Army, we would have been born with green, baggy skin.
        1. Hallo Jan,

          [..]

          Am einfachsten waere das hier:

          $str = str_replace($wort,'&'.$wort.'&',$str);

          Das geht prinziepell schon er soll mir aber halt nicht alle ersetzen sondern nur die in Links. Es muss draum mit nenm regexp sein.

          Ueberigens ist
          es nicht unbedingt die feine englische Art, hier mit Fullquotes
          um sich zu werfen.

          Sorry wollte es nur lesbar halten.

          Kann mir also jemand mit dem regexp. weiterhelfen. Danke

          1. Hallo Jan,

            Das geht prinziepell schon er soll mir aber halt nicht alle
            ersetzen sondern nur die in Links. Es muss draum mit nenm
            regexp sein.

            Ahso. Nunja, das ist so ohne weiteres mit RegExen nicht mehr
            loesbar. Da wirst du einen richtigen[tm] Parser bauen muessen.
            HTML mit einem RegEx zu parsen ist halt nicht moeglich.

            Gruesse,
             CK

            --
            http://cforum.teamone.de/
            http://wishlist.tetekum.de/
            If God had meant for us to be in the Army, we would have been born with green, baggy skin.
      2. hi,

        Wie kann ich das jetzt schreiben das er mir von dem gefunden link nur das wort "word" in "&word&" abändert. Für ein Beispiel wäre ich wirklich dankbar.

        du musst wohl dafür sorgen, dass "alles andere" was der ausdruck findet, auch eine backreference erzeugt, so dass du diese textstellen im ersatzstring wieder aufführen kannst.

        gruss,
        wahsaga

        1. hi,

          [..]

          du musst wohl dafür sorgen, dass "alles andere" was der ausdruck findet, auch eine backreference erzeugt, so dass du diese textstellen im ersatzstring wieder aufführen kannst.

          Genau hab ich mir auch gedacht darum hab ich das ganze jetzt so geschrieben:
          $search_pattern = "/(<)([\w]+)([^>]*>)(.*)(".$word.")(.*)(</\2>)/";
          $replacement_pattern = '$1$2$3$4&$5&$6$7';
          preg_replace($search_pattern, $replacement_pattern, $html);

          passiert aber gar nix. Stimmt da was von der Schreibweise nicht? Oder was mache ich sonst verskehrt???

          1. hi,

            passiert aber gar nix. Stimmt da was von der Schreibweise nicht? Oder was mache ich sonst verskehrt???

            hm, reguläre ausdrücke sind ein difiziles thema, hab mich damit bisher auch nur ansatzweise beschäftigt.

            aber wäre es nicht möglich, dass du erstmal deine bedingung ein wenig vereinfachst?

            du willst ja auf jedes wort zugreifen, dass in einem link steht.

            dafür würde es doch eigentlich reichen, abzufragen, ob nach wort nur beliebige zeichen ausser einem < kommen, und anschliessend ein </a>.

            setzt natürlich wohlgeformten html-code voraus, und dass du alle links auch wirklich mit </a> abschliesst, und nicht etwa mit </a > oder so ...

            gruss,
            wahsaga