String mit Umlauten hervorheben

Va7e

Mitglied
Hi,

ich habe mal wieder ein Problem ;-)

Ich suche mit meinem Programm nach verschiedenen Suchbegriffen, was auch problemlos klappt. Das Problem ist jedoch, dass ich den gefundenen Suchbegriff farblich markieren möchte. Das tut er auch, allerdings nur, wenn ich die Umlaute klein schreibe.

Kleine Übersicht:
"Qualität" bzw. "qualität" wird gefunden und auch richtig markiert,
gebe ich jedoch "Änderung" ein, wird alles gefunden, aber markiert wird nur "Änderung",
die kleingeschriebenen Wörter, z.B. "Programmänderungen" werden NICHT markiert.

Hier ist der PHP-Code:

PHP:
function HighlightSuchbegriff ( $strInhalt, $strSuchBegriff)
  {
	$bCase = TRUE;
    $strModifier = '';
    if ( $bCase )
    {
      // Modifikator "i": Groß- und Kleinschreibung ignorieren.
      $strModifier = 'i';
    }
    $strQuotedNeedle = preg_quote ( $strSuchBegriff, '/' );
    $strPattern = '/' . $strQuotedNeedle . '/' . $strModifier;
	$strReplacement = "<span style='background-color: #FFFF00'><b>$0</b></span>";
    return preg_replace ( $strPattern, $strReplacement, $strInhalt );
  }

Die Funktion setlocale() ist keine richtige Lösung, da das Programm in mehreren Ländern benutzt wird. Korrigiert mich, wenn ich falsch liege, bin noch ein Anfänger, was PHP angeht :-)

Gruß,

Va7e
 
Du suchst ja nur "änderung" also muss es in deinem Pattern auch explizit angegeben werden.

Versuch mal folgendes:

PHP:
 $strPattern = '/(.*)' . $strQuotedNeedle . '(.*)/' . $strModifier;
 
Es müsste wohl eher so aussehen:
PHP:
$strPattern = '/(.*' . $strQuotedNeedle . '.*)/' . $strModifier;
Anderenfalls würde er den Wert nicht in den Platzhalter $1 speichern.
 
Danke für die schnelle Antwort. Ich habe es jetzt selber gelöst, ich glaube sogar, dass es in der Zeit war, als du es gepostet hast ;-)

Es gab vorher eine Schleife (Hatte ich vorher nicht berücktichtigt), die die obige Highlight-Methode aufruft. Die Lösunt sieht so aus:

PHP:
foreach($p_suchbegriff_array as $s_begriff)
		{
			if(trim($s_begriff)> '')
			{
				$inhalt = HighlightSuchbegriff($inhalt, mb_strtolower($s_begriff, 'UTF-8'));		
			}
		}

mb_strtolower($s_begriff, 'UTF-8') wandelt den String in Kleinbuchstaben um, dahinter habe ich eine zweite Schleife mit mb_strtoupper($s_begriff, 'UTF-8'), da werden die Großbuchstaben verwendet. Ist vielleicht etwas unsauber, aber es funktioniert super ;-)
 
Es müsste wohl eher so aussehen:
PHP:
$strPattern = '/(.*' . $strQuotedNeedle . '.*)/' . $strModifier;
Anderenfalls würde er den Wert nicht in den Platzhalter $1 speichern.

Er verwendet aber Platzhalter $0, somit sollte golgender Regex funktionieren:

PHP:
$searchString = 'Programmänderungen';

print_r(preg_match('~(.*)änderung(.*)~i', $searchString));
Ausgabe:

Code:
Array
(
    [0] => Programmänderungen
    [1] => Programm
    [2] => en
)

Bei Großbuchstabenumlauten könntest du noch den "UTF-8 Modifier" mitgeben, dann wirds auch gefunden.

PHP:
print_r(preg_match('~(.*)Änderung(.*)~iu', $searchString));

Ausgabe:

Code:
Array
(
    [0] => Programmänderungen
    [1] => Programm
    [2] => en
)
 
Zuletzt bearbeitet:
Zurück