regexp preg_replace | html tag inhalte ändern
Jan Entzminger
- php
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
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
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
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
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
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
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
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???
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