Username ersetzten

Bash, Shell, PHP, Python, Perl, CGI
Post Reply
theomega
Userprojekt
Userprojekt
Posts: 696
Joined: 2003-01-27 14:36
Contact:
 

Username ersetzten

Post by theomega »

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
c14l
Posts: 31
Joined: 2002-12-24 09:37
 

Re: Username ersetzten

Post by c14l »

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.
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:1. Jedes Vorkommen von einem Text ($text) soll durch einen zweiten ersetzt werden ($text2)
$string =~ s/$text/$text2/g;
theomega wrote:2. Dies soll nicht inerhalb (zwischen) "<" und ">" passieren. Also nicht inerhalb von HTML-Tags
$string =~ s/(>.*)$text(.*?<)/$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/g;
theomega wrote:4. Absätze sollen wie Leerstellen zählen, wenn das Wort also direkt am Zeilenanfang steht, soll trotzdem geparst werden.
$string =~ s/(>.*)b$textb(.*?<)/$1$text2$2/gs;

Gruß
C14L
theomega
Userprojekt
Userprojekt
Posts: 696
Joined: 2003-01-27 14:36
Contact:
 

Re: Username ersetzten

Post by theomega »

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.
c14l
Posts: 31
Joined: 2002-12-24 09:37
 

Re: Username ersetzten

Post by c14l »

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ß
c14l
Posts: 31
Joined: 2002-12-24 09:37
 

Re: Username ersetzten

Post by c14l »

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ß
markus niewerth
Posts: 54
Joined: 2002-10-20 18:39
Location: Bocholt
Contact:
 

Re: Username ersetzten

Post by markus niewerth »

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. ?
theomega
Userprojekt
Userprojekt
Posts: 696
Joined: 2003-01-27 14:36
Contact:
 

Re: Username ersetzten

Post by theomega »

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:

Code: Select all

Ich heiße Heinz und ...
Das soll ersetzt werden

Code: Select all

Heinz ist blöd
auch

Code: Select all

Der Heinz
der ist blöd
auch

Jetzt verstanden?
markus niewerth
Posts: 54
Joined: 2002-10-20 18:39
Location: Bocholt
Contact:
 

Re: Username ersetzten

Post by markus niewerth »

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
Last edited by markus niewerth on 2003-02-21 14:38, edited 3 times in total.
theomega
Userprojekt
Userprojekt
Posts: 696
Joined: 2003-01-27 14:36
Contact:
 

Re: Username ersetzten

Post by theomega »

soso, und dann lese dir mal den Punkt 2 durch, geht das denn so überhaupt?
c14l
Posts: 31
Joined: 2002-12-24 09:37
 

Re: Username ersetzten

Post by c14l »

theomega wrote:Jetzt verstanden?
Ã?hm... jetzt hab ich's nicht mehr verstanden :(

Um ein Bespiel zu nennen:

Code: Select all

<font family="Arial">My family</font>
Du möchtest das Wort "Family" ersetzen, aber nur im Text, nicht das HTML-Attribut. Hab ich das richtig verstanden?

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
Das sollte dann schon reichen...
theomega
Userprojekt
Userprojekt
Posts: 696
Joined: 2003-01-27 14:36
Contact:
 

Re: Username ersetzten

Post by theomega »

Ich habe es jetzt so gemacht:

Code: Select all

$string = preg_replace("/(>[^<]*)b$textb/s","REPlACE12",$string); 
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.
markus niewerth
Posts: 54
Joined: 2002-10-20 18:39
Location: Bocholt
Contact:
 

Re: Username ersetzten

Post by markus niewerth »

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:

wobei in $string der Artikel drine ist und in $text der Usernamen. Der Replace-String ist nur zum testen
einfach str_replace nehmen. Oder hast Du den Namen extra gekennzeichnet oda was??
theomega
Userprojekt
Userprojekt
Posts: 696
Joined: 2003-01-27 14:36
Contact:
 

Re: Username ersetzten

Post by theomega »

also, nochmal:

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>
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?
c14l
Posts: 31
Joined: 2002-12-24 09:37
 

Re: Username ersetzten

Post by c14l »

theomega wrote:Ich habe es jetzt so gemacht:

Code: Select all

$string = preg_replace("/(>[^<]*)b$textb/s","REPlACE12",$string); 
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.
Mach noch einen zweiten:

Code: Select all

$string = preg_replace("/^([^<]*)b$textb/s","REPlACE12",$string); 
Der erste geht nur, wenn vor dem zu ersetzenden Wort schon ein html-Tag steht. Der zweite gilt nur, wenn vor dem zu ersetzenden Wort noch kein Tag stand.

Was ist eigentlich das 12?? Sind das referenzen auf gefundene Klammern? Du hast doch nur eine Klammer...
theomega
Userprojekt
Userprojekt
Posts: 696
Joined: 2003-01-27 14:36
Contact:
 

Re: Username ersetzten

Post by theomega »

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?
markus niewerth
Posts: 54
Joined: 2002-10-20 18:39
Location: Bocholt
Contact:
 

Re: Username ersetzten

Post by markus niewerth »

HI, ich weiß das es jetzt ein bischen kompliziert ist, aber es funktioniert 100%

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
?>
Du kannst als unexcepted Caracter auch ein array durchlaufen. So würd ich das auf die schnelle machen.


Gruß Markus
theomega
Userprojekt
Userprojekt
Posts: 696
Joined: 2003-01-27 14:36
Contact:
 

Re: Username ersetzten

Post by theomega »

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
markus niewerth
Posts: 54
Joined: 2002-10-20 18:39
Location: Bocholt
Contact:
 

Re: Username ersetzten

Post by markus niewerth »

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 ^^
theomega
Userprojekt
Userprojekt
Posts: 696
Joined: 2003-01-27 14:36
Contact:
 

Re: Username ersetzten

Post by theomega »

Ã?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:

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);

?>
Demo gibst auch gleich noch dazu:
http://dominik.pagenstecher.de/parsetest.php

Das dürfte genügen

Grüße
TO
markus niewerth
Posts: 54
Joined: 2002-10-20 18:39
Location: Bocholt
Contact:
 

Re: Username ersetzten

Post by markus niewerth »

EDIT 2: 23.02.2003 4:19Uhr

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); 

?> 
Ich glaub das wars im gröbsten.
theomega
Userprojekt
Userprojekt
Posts: 696
Joined: 2003-01-27 14:36
Contact:
 

Re: Username ersetzten

Post by theomega »

Das Ding hat aber ein Problem: wenn man als Namen "UT 2003" eingibt, dann findet es nichts.
markus niewerth
Posts: 54
Joined: 2002-10-20 18:39
Location: Bocholt
Contact:
 

Re: Username ersetzten

Post by markus niewerth »

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
Post Reply