[PHP] Funktion zum Wörter ersetzen

Dieses Thema im Forum "Webentwicklung" wurde erstellt von GaYlORd, 10. Juli 2013 .

  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
     
  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.
  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.
  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.
  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
     
  6. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.