highlightKeywords ohne Groß- Kleinschreibung


Thomas_Jung

Erfahrenes Mitglied
Hallo,
folgende function findet "rech" in dem Wort "Planungsrechnung" und zeigt es auch Rot an.
Schreibe ich das R von rech Groß wird es nicht Rot angezeigt.
Ist es möglich das auch Rech, RECH, ReCh im Wort "Planungsrechnung" Rot anzeigt.

PHP:
function highlightKeywords($string, $term){  
$term = preg_replace('/\s+/', ' ', trim($term)); 
     $words = explode(',', $term); 
         $highlighted = array();
             foreach ( $words as $word ){     
                $highlighted[] = "<span class='highlight' style='color:red;'>".$word."</span>";   
                 }      return str_replace($words, $highlighted,  $string);
}
Gruß Thomas
 

merzi86

Erfahrenes Mitglied
du könntest anstelle von str_replace str_ireplace nutzen.

http://de2.php.net/manual/de/function.str-ireplace.php

Wobei der Hinweis zu beachten ist.
Außerdem kannst du dir das preg_replace sparen, wenn du bei der Iteration durch die Words mit einen Zeiger arbeitest.
z.B. so:
PHP:
function highlightKeywords($string, $term){ 
    $words = explode(',', $term);
    $highlighted = array();
  
    foreach ( $words as &$word ){
       $word = trim( $word );
        $highlighted[] = sprintf("<span class='highlight' style='color:red;'>%s</span>", $word); 
    }
  
    return str_ireplace($words, $highlighted,  $string);
}
Diese Variante hat aber den Nachteil, das die Groß- und Kleinschreibung des Original verworfen wird.
Falls dies nicht gewünscht ist, dann könntest du dies z.B. so umgehen:
PHP:
function highlightKeywords($string, $term){ 
    $words = array( );
    $highlighted = array( );
  
    foreach( explode( ',', $term ) as $word ) {
        preg_match_all( sprintf( "/%s/i", trim( $word ) ),
                        $string,
                        $words2 );

        foreach( $words2 as $words3 )
            foreach( $words3 as $word2 ) {
                $words[] = $word2;
                $highlighted[] = sprintf( "<span class='highlight' style='color:red;'>%s</span>", $word2 );
            }
      
      
    }

    return str_replace($words, $highlighted,  $string);
}
BTW: hat es die Strukturierte Schreibweise hier im Forum zerstört oder schreibst du das so in deiner Entwicklungsumgebung? Das lässt sich so doch recht schwer lesen.
 
Zuletzt bearbeitet:

Thomas_Jung

Erfahrenes Mitglied
PHP:
function highlightKeywords($string, $term){
    $words = array( );
    $highlighted = array( );
 
    foreach( explode( ',', $term ) as $word ) {
        preg_match_all( sprintf( "/%s/i", trim( $word ) ),
                        $string,
                        $words2 );

        foreach( $words2 as $words3 )
            foreach( $words3 as $word2 ) {
                $words[] = $word2;
                $highlighted[] = sprintf( "<span class='highlight' style='color:red;'>%s</span>", $word2 );
            }
     
     
    }

    return str_replace($words, $highlighted,  $string);
}
macht exakt was es soll.

Vielen Dank :):):):)
 

Thomas_Jung

Erfahrenes Mitglied
Hallo merzi86,

die Funktion macht exakt was sie soll :)
Aber wenn ich nach AC/DC suche kommt die Fehlermeldung (Warning: preg_match_all(): Unknown modifier ').
Durch den / (Schrägstrich) kommt die Fehlermeldung.
Gibt es dafür auch eine Lösung ?

Gruß Thomas

PHP:
function highlightKeywords($string, $term){
    $words = array( );
    $highlighted = array( );
    foreach( explode( ',', $term ) as $word ) {
        preg_match_all( sprintf( "/%s/i", trim( $word ) ),
                        $string,
                        $words2 );
        foreach( $words2 as $words3 )
            foreach( $words3 as $word2 ) {
                $words[] = $word2;
                $highlighted[] = sprintf( "<span class='highlight' style='color:red;'>%s</span>", $word2 );
            }
    
    
    }
    return str_replace($words, $highlighted,  $string);
}
 

merzi86

Erfahrenes Mitglied
Moin,
bin jetzt zwar kein PHP-Experte, aber kann man das hier nicht auch escapen??
VG Klaus
Ja das ist die Lösung!

PHP:
...
foreach( explode( ',', $term ) as $word ) {
        $word = str_replace( '/', '\/', $word );
        preg_match_all( sprintf( "/%s/i", trim( $word ) ),
....
Das ist ungetestet, aber es müsste funktionieren!

Als Erklärung: / ist bei Regular Expression der Start- bzw. End-Delimiter für die Expression. Das bedeutet es würde das DC usw. als Option für die Ausführung Inpretieren und dann kommt der nächste Delimiter und ein 2. Start- bzw. End-Delimiter darf es nicht geben.
 

Bratkartoffel

gebratene Kartoffel
Premium-User