Username ersetzten
Username ersetzten
Hallo
ich habe in PHP in einem String ($string) einen Artikel aus einem Forum drine. Vollständig geparst, also nur noch mit HTML Code.
Jetzt würde ich gerne in diesem Text folgendes machen:
1. Jedes Vorkommen von einem Text ($text) soll durch einen zweiten ersetzt werden ($text2)
2. Dies soll nicht inerhalb (zwischen) "<" und ">" passieren. Also nicht inerhalb von HTML-Tags
3. Das soll nur bei neuen Wörter passieren, nicht also inerhalb von Wörtern.
4. Absätze sollen wie Leerstellen zählen, wenn das Wort also direkt am Zeilenanfang steht, soll trotzdem geparst werden.
Wie geht das am besten. Ich habe schon einige preg_replaces probiert, allerdings haben die nicht alle obrigen Bedinungen erfüllt (erfüllen können)
Wer weiß Rat
TO
ich habe in PHP in einem String ($string) einen Artikel aus einem Forum drine. Vollständig geparst, also nur noch mit HTML Code.
Jetzt würde ich gerne in diesem Text folgendes machen:
1. Jedes Vorkommen von einem Text ($text) soll durch einen zweiten ersetzt werden ($text2)
2. Dies soll nicht inerhalb (zwischen) "<" und ">" passieren. Also nicht inerhalb von HTML-Tags
3. Das soll nur bei neuen Wörter passieren, nicht also inerhalb von Wörtern.
4. Absätze sollen wie Leerstellen zählen, wenn das Wort also direkt am Zeilenanfang steht, soll trotzdem geparst werden.
Wie geht das am besten. Ich habe schon einige preg_replaces probiert, allerdings haben die nicht alle obrigen Bedinungen erfüllt (erfüllen können)
Wer weiß Rat
TO
Re: Username ersetzten
Hi! Ich versuch mich mal an der Sache, allerdings mit Perl-RegExps, da ich in PHP nicht so fitt bin. Sollte aber wohl im Grunde ähnlich funktionieren AFAIK...theomega wrote:ich habe in PHP in einem String ($string) einen Artikel aus einem Forum drine. Vollständig geparst, also nur noch mit HTML Code.
$string =~ s/$text/$text2/g;theomega wrote:1. Jedes Vorkommen von einem Text ($text) soll durch einen zweiten ersetzt werden ($text2)
$string =~ s/(>.*)$text(.*?<)/$1$text2$2/g;theomega wrote:2. Dies soll nicht inerhalb (zwischen) "<" und ">" passieren. Also nicht inerhalb von HTML-Tags
$string =~ s/(>.*)b$textb(.*?<)/$1$text2$2/g;theomega wrote:3. Das soll nur bei neuen Wörter passieren, nicht also inerhalb von Wörtern.
$string =~ s/(>.*)b$textb(.*?<)/$1$text2$2/gs;theomega wrote:4. Absätze sollen wie Leerstellen zählen, wenn das Wort also direkt am Zeilenanfang steht, soll trotzdem geparst werden.
Gruß
C14L
Re: Username ersetzten
Hey, danke, habe ja schon mit keiner Antwort mehr gerechnet. Allerdings bekomme ich das nicht in PHP umgesetzt. Wie muß ich dass in ein "preg_replace" einfügen? Der erwartet 3 Parameter:
1. Match-String
2. Replace-String
3. Woring gesucht werden soll
3. Weiß ich nacürlich, allerdings weiß ich nicht, wie ich deinen Code auf die zwei ersten beiden verteilen soll.
1. Match-String
2. Replace-String
3. Woring gesucht werden soll
3. Weiß ich nacürlich, allerdings weiß ich nicht, wie ich deinen Code auf die zwei ersten beiden verteilen soll.
Re: Username ersetzten
Wie gesagt, mit PHP hab ich nicht so die Ahnung und mach einfach zu selten etwas. Bei http://www.php.net einfach mal nach preg_replace etc. suchen, die HOWTOs da sind recht gut...
Gruß
Gruß
Re: Username ersetzten
preg_replace("/(>.*)b$textb(.*?<)/gs","$1$text2$2",$string);
So in der Art, nehm ich an... allerdings wird PHP nicht die $1 und die $2-Variablen kennen. Darin ist der Inhalt der ersten und der zweiten gefundenen Klammer gespeichert, also das, was hinter der ">"-Klammer bis zum Beginn des Textes steht ($1), bzw. das, was nach dem Text bis zur nächsten "<"-Klammer steht ($2).
IIRC gibt es in PHP da irgenteine spezielle Variable für... nur welche... 8O
Gruß
So in der Art, nehm ich an... allerdings wird PHP nicht die $1 und die $2-Variablen kennen. Darin ist der Inhalt der ersten und der zweiten gefundenen Klammer gespeichert, also das, was hinter der ">"-Klammer bis zum Beginn des Textes steht ($1), bzw. das, was nach dem Text bis zur nächsten "<"-Klammer steht ($2).
IIRC gibt es in PHP da irgenteine spezielle Variable für... nur welche... 8O
Gruß
-
- Posts: 54
- Joined: 2002-10-20 18:39
- Location: Bocholt
- Contact:
Re: Username ersetzten
Hiho, klingt ja ziemlich kriminell und verworren. Entweder kann ich um diese Uhrzeit nicht mher klar denken, oder Du hast es einfach zu ungenau umschrieben. Was ich nicht so ganz verstehe:
1. und 2. habe ich ja noch kappirt aber 3. und 4. ?
1. und 2. habe ich ja noch kappirt aber 3. und 4. ?
Re: Username ersetzten
DAs ist ganz einfach:
Wenn der User "heinz" heißt, und immer das was von dem "Code" umschlossen ist, ein Artikel ist, dann soll das hier geparst werden:
Das soll ersetzt werden
auch
auch
Jetzt verstanden?
Wenn der User "heinz" heißt, und immer das was von dem "Code" umschlossen ist, ein Artikel ist, dann soll das hier geparst werden:
Code: Select all
Ich heiße Heinz und ...
Code: Select all
Heinz ist blöd
Code: Select all
Der Heinz
der ist blöd
Jetzt verstanden?
-
- Posts: 54
- Joined: 2002-10-20 18:39
- Location: Bocholt
- Contact:
Re: Username ersetzten
Also wenn Du die Werte der einzelnen Variablen hast, mach es mit str_replace(). Eine PCRE Funktion bringt Dir erst was, wenn Du sie richtig einsetzt. Ich glaube hier langt ein einfaches str_replace().
str_replace ($name1, $name2, $article);
str_replace ($name2, $name3, $article);
Mit preg_replace() suchst Du nur, wenn es nicht 100% sicher ist, das man den Namen auch anders ersten kann.
Hier ein kleines Beispiel aus einer Template Classe von mir.
$parser = preg_replace("/({)(.*)(})/U","$\2",$text);
Dies ersetzt explizit {var} durch $var.
In dem Beispiel wird Gruppierung 1 und 3 verworfen, die brauchen wir nicht mehr. Hier wird dann einfach nur noch die \2 eingefügt, eben ein $ Zeichen und die Gruppirung 2, somit ist es dann eine Variable.
So jetzt bist Du dran ^^
Gruß Markus
str_replace ($name1, $name2, $article);
str_replace ($name2, $name3, $article);
Mit preg_replace() suchst Du nur, wenn es nicht 100% sicher ist, das man den Namen auch anders ersten kann.
Hier ein kleines Beispiel aus einer Template Classe von mir.
$parser = preg_replace("/({)(.*)(})/U","$\2",$text);
Dies ersetzt explizit {var} durch $var.
In dem Beispiel wird Gruppierung 1 und 3 verworfen, die brauchen wir nicht mehr. Hier wird dann einfach nur noch die \2 eingefügt, eben ein $ Zeichen und die Gruppirung 2, somit ist es dann eine Variable.
So jetzt bist Du dran ^^
Gruß Markus
Last edited by markus niewerth on 2003-02-21 14:38, edited 3 times in total.
Re: Username ersetzten
soso, und dann lese dir mal den Punkt 2 durch, geht das denn so überhaupt?
Re: Username ersetzten
Ã?hm... jetzt hab ich's nicht mehr verstanden :(theomega wrote:Jetzt verstanden?
Um ein Bespiel zu nennen:
Code: Select all
<font family="Arial">My family</font>
Du suchst also im string nach dem Vorkommen von "family", aber nur da, wo links des Wortes ein ">" steht. Zwischen dem ">" und dem Suchwort dürfen allerdings beliebig viele belibige Zeichen sein, außer "<". Nach dem Suchwort dürfen au0erdem belibig viele beliebige Zeichen folgen.
Dann also eine kleine Ã?nderung:
Code: Select all
s/(>[^<]*)b$txt1b/$1$txt2/gs
Re: Username ersetzten
Ich habe es jetzt so gemacht:
wobei in $string der Artikel drine ist und in $text der Usernamen. Der Replace-String ist nur zum testen.
/g kann man laut PHP-Doku weglassen, ist angeblich Standard.
Aber: es passiert rein garnichts. Es wird überhaupt nichts ersetzt.
Code: Select all
$string = preg_replace("/(>[^<]*)b$textb/s","REPlACE12",$string);
/g kann man laut PHP-Doku weglassen, ist angeblich Standard.
Aber: es passiert rein garnichts. Es wird überhaupt nichts ersetzt.
-
- Posts: 54
- Joined: 2002-10-20 18:39
- Location: Bocholt
- Contact:
Re: Username ersetzten
Ich kann Dir einfach nicht helfen, weil Du nicht in der Lage bist das richtig zu beschreiben. Ohne den String kann ich mir das nicht vorstellen.
Poste doch mal den $string (wäre doch mal ne Idee ;))
Du kannst für das was du machen willst:
Poste doch mal den $string (wäre doch mal ne Idee ;))
Du kannst für das was du machen willst:
einfach str_replace nehmen. Oder hast Du den Namen extra gekennzeichnet oda was??
wobei in $string der Artikel drine ist und in $text der Usernamen. Der Replace-String ist nur zum testen
Re: Username ersetzten
also, nochmal:
ich habe diesen Text:
In diesem Text soll jetzt also das "TheOmega" durch einen Link auf sein Profil ersetzt werden. Allerdings nur im "puren" Text, nicht also in Links zum Beispiel. Außerdem auch nur, wenn das TheOmega ein einzelnes Wort ist, es soll also nicht geparst werden, wenn es innerhalb eines Wortes ist.
Jetzt Verstanden?
ich habe diesen Text:
Code: Select all
Wir Danken TheOmega für seine Unterstüzung. Hier noch seine Homepage:
<a href="www.theomega.de">Homepage</a>
Jetzt Verstanden?
Re: Username ersetzten
Mach noch einen zweiten:theomega wrote:Ich habe es jetzt so gemacht:wobei in $string der Artikel drine ist und in $text der Usernamen. Der Replace-String ist nur zum testen.Code: Select all
$string = preg_replace("/(>[^<]*)b$textb/s","REPlACE12",$string);
/g kann man laut PHP-Doku weglassen, ist angeblich Standard.
Aber: es passiert rein garnichts. Es wird überhaupt nichts ersetzt.
Code: Select all
$string = preg_replace("/^([^<]*)b$textb/s","REPlACE12",$string);
Was ist eigentlich das 12?? Sind das referenzen auf gefundene Klammern? Du hast doch nur eine Klammer...
Re: Username ersetzten
Hey, danke, jetzt geht es: es hat nur noch einen Fehler:
ich stelle jetzt hinter jeden Namen ein kleines Icon mit Link auf das Profil.
wenn ich zwei User habe, zum Beispiel
1. "The"
2. "TheOmega"
dann wird jedes Vorkommen von "TheOmega" zweimal geparst. Es kommen also 2 Bilder dahinter, eins für "the" und eins für "theOmega". Nicht so toll, wäre es möglich, dass die Namen nur einmal geparst werden?
ich stelle jetzt hinter jeden Namen ein kleines Icon mit Link auf das Profil.
wenn ich zwei User habe, zum Beispiel
1. "The"
2. "TheOmega"
dann wird jedes Vorkommen von "TheOmega" zweimal geparst. Es kommen also 2 Bilder dahinter, eins für "the" und eins für "theOmega". Nicht so toll, wäre es möglich, dass die Namen nur einmal geparst werden?
-
- Posts: 54
- Joined: 2002-10-20 18:39
- Location: Bocholt
- Contact:
Re: Username ersetzten
HI, ich weiß das es jetzt ein bischen kompliziert ist, aber es funktioniert 100%
Du kannst als unexcepted Caracter auch ein array durchlaufen. So würd ich das auf die schnelle machen.
Gruß Markus
Code: Select all
<?php
// Test for a exact replace
$string = "Wir Danken TheOmega für seine Unterstüzung. Hier noch "
."seine Homepage: <a href="http://www.TheOmega.de">Homepage</a>";
$search = "TheOmega";
$insert = "<a href="link.php">TheOmega</a>";
// split al words
$exp = explode(" ",$string);
foreach ( array_keys($exp) AS $elem ){
// check the String if unexcepted is included
if( strpos ($exp[$elem], "<") === false && strpos ($exp[$elem], ">") === false){
// newstring replaced very easy
$newstring = str_replace($search,$insert,$exp[$elem]);
}else{
// newstring leaves normal
$newstring = $exp[$elem];
}
// give it out
print ( $newstring." " );
}
// end
?>
Gruß Markus
Re: Username ersetzten
Danke Markus,
aber auch das geht nicht, wenn ich als Search
"Unreal" und als Replace "<b>Unreal</b>" nehme, dann werden im normalen Text garnichts geparst, und die URL's werden verstümmelt:
http://<b>unreal</b>tournament2003.com/patch_fixlist.php
GRüße
TO
aber auch das geht nicht, wenn ich als Search
"Unreal" und als Replace "<b>Unreal</b>" nehme, dann werden im normalen Text garnichts geparst, und die URL's werden verstümmelt:
http://<b>unreal</b>tournament2003.com/patch_fixlist.php
GRüße
TO
-
- Posts: 54
- Joined: 2002-10-20 18:39
- Location: Bocholt
- Contact:
Re: Username ersetzten
Ham wa gleich...
Ã?hm??? Hallo. Das ist doch quatsch was Du sagst. Entweder du hast es nicht ausprobiert oder ich weiß auch net. Auf jeden Fall stell ich eine If Bedingung und in der steht drin, das er eben nicht bei URLs ersetzen soll.
siehe hier:
strpos ($exp[$elem], "<") === false
Gruß Markus
P.S: Das ganze Ding so ist auch keine Endlösung, Du musst Dir eben genau überlegen was alles für Character vorkommen dürfen. Ich kann nämlich garantiert nicht Hellsehn ^^
Ã?hm??? Hallo. Das ist doch quatsch was Du sagst. Entweder du hast es nicht ausprobiert oder ich weiß auch net. Auf jeden Fall stell ich eine If Bedingung und in der steht drin, das er eben nicht bei URLs ersetzen soll.
siehe hier:
strpos ($exp[$elem], "<") === false
Gruß Markus
P.S: Das ganze Ding so ist auch keine Endlösung, Du musst Dir eben genau überlegen was alles für Character vorkommen dürfen. Ich kann nämlich garantiert nicht Hellsehn ^^
Re: Username ersetzten
Ã?hm, also getestet habe ich das ganz sicher, aber du kannst ja gerne mal diesen Code auf deinem Server ausführen lassen, dann glaubst du mir, dass es so nicht geht:
Demo gibst auch gleich noch dazu:
http://dominik.pagenstecher.de/parsetest.php
Das dürfte genügen
Grüße
TO
Code: Select all
<?
$string = 'Auch der nächste Patch für UT 2003 ist da: Version 2186.
<br>Hier gibt es den ChangeLog:
<br><a href="http://unrealtournament2003.com/patch_fixlist.php
" target="_blank">http://unrealtournament2003.com/patch_fixlist.php
</a><br>
<br>Und hier der Download:
<br><a href="http://unrealtournament2003.com/dl_patch_v2186.php
" target="_blank">http://unrealtournament2003.com/dl_patch_v2186.php
</a><br><br> <br> Quelle: <a href="http://unrealtournament2003.com" target="_blank">http://unrealtournament2003.com</a>';
echo('<b>Eingang:</b><br>'.$string);
$search = "unreal";
$insert = "<b>unreal</b>";
$res = ''; //Zum speichern des Ergebnisses
// split al words
$exp = explode(" ",$string);
foreach ( array_keys($exp) AS $elem ){
// check the String if unexcepted is included
if( strpos ($exp[$elem], "<") === false && strpos ($exp[$elem], ">") === false){
// newstring replaced very easy
$newstring = str_replace($search,$insert,$exp[$elem]);
}else{
// newstring leaves normal
$newstring = $exp[$elem];
}
// give it out
$res .= $newstring." ";
}
// end
echo('<hr><b>Ausgang:</b><br>'.$res);
?>
http://dominik.pagenstecher.de/parsetest.php
Das dürfte genügen
Grüße
TO
-
- Posts: 54
- Joined: 2002-10-20 18:39
- Location: Bocholt
- Contact:
Re: Username ersetzten
EDIT 2: 23.02.2003 4:19Uhr
Ich glaub das wars im gröbsten.
Code: Select all
<?php
$string = ' unreal Auch der nächste Patch für UT 2003 ist da: Version 2186.
<br>Hier gibt es den ChangeLog:
<br><a href="http://unrealtournament2003.com/patch_fixlist.php
" target="_blank">http://unrealtournament2003.com/patch_fixlist.php
</a><br>
<br>Und hier der Download:
<br><a href="http://unrealtournament2003.com/dl_patch_v2186.php
" target="_blank">http://unrealtournament2003.com/dl_patch_v2186.php
</a><br><br> <br> Quelle: <a href="http://unrealtournament2003.com" target="_blank">http://unrealtournament2003.com</a>';
print ('<b>Eingang:</b><br> '.$string);
$search = "unreal";
$insert = "<b>unreal</b>";
$res = ''; //Zum speichern des Ergebnisses
// split al words
$exp = explode(" ",$string);
foreach ( array_keys($exp) AS $elem ){
// check the String if unexcepted is included
if(strrpos ($exp[$elem], "<a h") === false && strrpos ($exp[$elem], "/>") === false){
// newstring leaves normal
$newstring = str_replace($search,$insert,$exp[$elem]);
}else{
// newstring replaced very easy
$newstring = $exp[$elem];
}
// give it out
$res .= $newstring." ";
}
// end
print ('<hr><b>Ausgang:</b><br> '.$res);
?>
Re: Username ersetzten
Das Ding hat aber ein Problem: wenn man als Namen "UT 2003" eingibt, dann findet es nichts.
-
- Posts: 54
- Joined: 2002-10-20 18:39
- Location: Bocholt
- Contact:
Re: Username ersetzten
theomega wrote:Das Ding hat aber ein Problem: wenn man als Namen "UT 2003" eingibt, dann findet es nichts.
Na dann lass Dir mal was einfallen ;) ist ja nur noch ein kleines Problem. Ã?berhaupt solltest Du nochmal eigene Ideen ausprobieren. Es bringt Dir nichts, wenn ich es Dir immer wieder vorcode, oder andere.
Das Problem wäre z.B. keines, wenn Du String suchst und das Leerzeichen durch ein Zeichen ersetzt. Dann den Text erst zerlegst.
Eventuell probierst Du es nochmal mit PCRE. Das sollte auch funktionieren. Bin mit Regex nicht mehr so in Ã?bung.
Gruß Markus