#1 10. Juli 2013 Funktion zum Wörter ersetzen Hi Leute, habe eine Funktion geschrieben, welche mir nur das erste vorkommen eines Strings innerhalb eines <p>-Tags ersetzen soll. Beispiel: Code: <p>Text der ersetzt werden sollte.</p> <p>Text der nicht mehr ersetzten werden sollte.</p> Ich möchte "der" durch "welcher" ersetzen, dann soll die Ausgabe so ausschauen: Code: <p>Text welcher ersetzt werden sollte</p> <p>Text der nicht mehr ersetzt werden sollte.</p> Wenn "der" nur im 2ten <p>-Tag vorkommt, wird es dort ersetzt. Prinzipiell funktioniert das auch, allerdings macht mir die Zusammensetzung der Teilstrings teilweise Probleme. Hab leider noch nicht wirklich rausgefunden an was es liegt, daher bitte ich euch um Hilfe bei der Fehlersuche: PHP: function change ( $text , $e = 0 , $i =- 1 ){ $arr [ 0 ] = array( ' Suchwort1 ' , ' Suchwort2 ' , ' Suchwort3 ' ); $arr [ 1 ] = array( ' Ersatzwort1 ' , ' Ersatzwort2 ' , ' Ersatzwort3 ' ); while( $i < sizeof ( $arr [ 0 ])){ // Nur Text in <p>-Tag ersetzen $i ++; if( strpos ( $text , "<p>" ) > $e ){ $start = strpos ( $text , "<p>" ); $ende = strpos ( $text , "</p>" ); $text_p = substr ( $text , $start , $ende - strlen ( "</p>" )); if( $i >= sizeof ( $arr [ 0 ])) $i --; //Falls im p tag suchtext vorhanden ist: if( strpos ( $text_p , $arr [ 0 ][ $i ]) > 0 ){ $text_p = substr ( $text_p , 0 , strpos ( $text_p , $arr [ 0 ][ $i ])). $arr [ 1 ][ $i ]. substr ( $text_p , strpos ( $text_p , $arr [ 0 ][ $i ])+ strlen ( $arr [ 0 ][ $i ])); $text = substr ( $text , 0 , $start ). $text_p . substr ( $text , $ende + strlen ( $arr [ 1 ][ $i ])); //Falls keiner vorhanden ist: }else{ $bbcode = new SimpleBBCode ; $text = substr ( $text , 0 , $start ). $text_p . $bbcode -> change ( substr ( $text , $start + strlen ( $text_p )), $e ++,( $i + 1 )); } } $e ++; } return $text ; } Vielen dank schonmal! Gruß gl + Multi-Zitat Zitieren
#2 10. Juli 2013 AW: Funktion Wörter ersetzen mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] ) str_replace("gesucht","ersetzt",$text,1); letzter Parameter (1) sagt das nur der erste vorkommende Treffer ersetzt wird. Wenn es etwas genauer sein muss, wäre auch preg_replace(); eine Möglichkeit. PHP: preg_replace ( "@(<p>.*) $gesuchteswort (.*</p>)@Usim" , '\\1' . $neueswort . '\\2' , $text , 1 ); 1 Person gefällt das. + Multi-Zitat Zitieren
#3 10. Juli 2013 AW: Funktion Wörter ersetzen Das ist nicht korrekt. Im letzten Parameter von str_replace kann eine Variable angegeben werden, welche dann nach dem Funktionsaufruf die Anzahl der Ersetzungen enthält. Damit kann man aber nicht bestimmten, wie oft etwas ersetzt werden soll. MfG 1 Person gefällt das. + Multi-Zitat Zitieren
#4 10. Juli 2013 Zuletzt bearbeitet: 10. Juli 2013 AW: Funktion Wörter ersetzen Nutze preg_replace_callback() Rein: Code: hallo<p>welt</p>test<p>123</p> <p>huhu</p> Magic: PHP: <? php $find = [ 'welt' , '123' ]; $repl = [ 'universum' , '456' ]; $limit = 1 ; $res = preg_replace_callback ( '/(<p[^>]*>)(.+?)(<\/p>)/i' , function ( $m ) use (& $find , & $repl ) { list (, $s , $t , $e ) = $m ; $t = str_replace ( $find , $repl , $t ); return " $s$t$e " ; }, $text , $limit ); print $res ; Raus: Code: hallo<p>universum</p>test<p>123</p> <p>huhu</p> 1 Person gefällt das. + Multi-Zitat Zitieren
#5 11. Juli 2013 AW: Funktion Wörter ersetzen Danke euch allen. Habe Murdocs Variante genommen, da die die kompakteste ist. 2 Änderungen habe ich noch vorgenommen. Taucht ein Suchwort öfter innerhalb eines p-Tags auf, wird jedes ersetzt -> str_replace wurde preg_replace Und sobald ein Zeilenumbruch (\n) in dem string ist, wird nichts ersetzt -> preg_replace("/[\s]+/"," ",$txt); Fertige Funktion schaut so aus: PHP: function change_me ( $txt ){ $txt = preg_replace ( "/[\s]+/" , " " , $txt ); $find = [ "/ Suchwort /" ]; $repl = [ " Ersetzwort " ]; $limit = 1 ; $res = preg_replace_callback ( '/(<p[^>]*>)(.+?)(<\/p>)/i' , function ( $m ) use (& $find , & $repl ) { list (, $s , $t , $e ) = $m ; $t = preg_replace ( $find , $repl , $t , 1 ); //$t = str_replace($find, $repl, $t); return " $s$t$e " ; }, $txt , $limit ); return $res ;} Gruß und nochmal Danke an alle gl + Multi-Zitat Zitieren