PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   PHP Developer Forum (https://www.php-resource.de/forum/php-developer-forum/)
-   -   Probleme bei Wortsuche mit preg_match (https://www.php-resource.de/forum/php-developer-forum/102951-probleme-bei-wortsuche-mit-preg_match.html)

unknownsoul 18-05-2012 13:11

Probleme bei Wortsuche mit preg_match
 
Hallo zusammen,

folgender Code funktioniert nicht, sobald Umlaute oder Sonderzeichen wie ß usw. im Suchwort enthalten sind:

PHP-Code:

$suchwort="Test";
if (
preg_match("/\b".$suchwort."\b/i""Das hier ist eine Test zum Testen der Sache.")) {
   echo 
"Es wurde 1 Übereinstimmung gefunden.";
} else {
   echo 
"Keine Übereinstimmung";


Hat jemand eine Lösung parat?

Kropff 18-05-2012 13:12

Mit welcher Zeichenkodierung arbeitest du?

Peter

unknownsoul 18-05-2012 13:16

Bisher mit noch gar keiner. Ist nur eine kleine PHP-Test-Datei und da funktionieren die Umlaute nicht. Zum Beispiel die Suche nach dem Wort "Öl" gibt kein Ergebnis zurück.

Im Header hab ich das hier:
Zitat:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
stehen. Aber das sollte ja keinen Einfluss auf den PHP-Code haben.

Kropff 18-05-2012 13:17

Zitat:

Zitat von unknownsoul (Beitrag 660991)
Bisher mit noch gar keiner. Ist nur eine kleine PHP-Test-Datei und da funktionieren die Umlaute nicht. Zum Beispiel die Suche nach dem Wort "Öl" gibt kein Ergebnis zurück.

Im Header hab ich das hier: stehen. Aber das sollte ja keinen Einfluss auf den PHP-Code haben.

Vertue dich da mal nicht. Schau dir mal dieses Tutorial an, da geht es um die Feinheiten.

unknownsoul 18-05-2012 13:31

Okay, UTF-8 ist ja schon mal der richtige Weg, da z.B. Umlaute nicht codiert werden müssen. Ich denke ja eher, dass preg_match Wörter mit Umlauten oder ß nicht als eigenständige Wörter anerkennt?! Denn selbst bei codierten Umlauten erkennt preg_match das Wort nicht.

unknownsoul 18-05-2012 13:38

Ohne /b, hat preg_match keine Probleme mit dem Umlaut. Das hier:

PHP-Code:

$suchwort="Öl";
if (
preg_match("/".$suchwort."/i""Morgen mache ich einen Ölwechsel.")) {
   echo 
"Es wurde 1 Übereinstimmung gefunden.";
} else {
   echo 
"Keine Übereinstimmung";


funktioniert. Allerdings findet er eben auch den Begriff Öl bei Ölwechsel. Ich möchte aber auf vollständige Wörter prüfen.

Kropff 18-05-2012 15:26

PHP-Code:

preg_match("/\s".$suchwort."\s/i""Morgen mache ich einen Ölwechsel."

So was?

Peter

unknownsoul 18-05-2012 17:04

Ja aber mit /b wie im Eröffnungspost. Ich glaube fast, dass das mit der Codierung nichts zu tun hat. PHP wird deutsche Wörter, die Umlaute usw. enthalten nicht als Wörter anerkennen. Daher nützt die Wortgrenze mit /b auch nicht viel. Wahrscheinlich brauche ich einen komplett neuen reg. Ausdruck.

wahsaga 18-05-2012 17:21

Ich würde erst mal probieren, eine entsprechende Locale zu setzen.

Und PHP: Unicode character properties - Manual könnte ggf. auch noch von Interesse sein.

fireweasel 18-05-2012 23:43

Zitat:

Zitat von unknownsoul (Beitrag 660989)
Hallo zusammen,

folgender Code funktioniert nicht, sobald Umlaute oder Sonderzeichen wie ß usw. im Suchwort enthalten sind:

PHP-Code:

$suchwort="Test";
if (
preg_match("/\b".$suchwort."\b/i""Das hier ist eine Test zum Testen der Sache.")) {
   echo 
"Es wurde 1 Übereinstimmung gefunden.";
} else {
   echo 
"Keine Übereinstimmung";


Hat jemand eine Lösung parat?

Bau dir die Wortgrenzen selbst: "Nichtwortzeichen"-Assertion + Suchbegriff + "Nichtwortzeichen"-Assertion. Es gibt dafür entsprechende Unicode-Klassen.

Die Assertion "\b" ist eine wenig brauchbare Altlast aus Pre-Unicode-Zeiten. Sie funktioniert nur im ASCII-Bereich oder in der jeweils eingestellten Codepage. Falls man das per setlocale() überhaupt sauber hinbekommt.

*korinthenkack* ... und das ß ist kein "Sonderzeichen", sondern[sic!] ein gewöhnlicher Buchstabe. Zumindest heutzutage. Früher war es ja mal eine Ligatur. Aber ich schweife ab ... ;)

unknownsoul 19-05-2012 10:51

Vielen Dank. Ich hab den Ausdruck nun wie folgt geändert:

PHP-Code:

preg_match("/\W".$suchwort."\W/i",$text

Jetzt erkennt er zwar, wenn ich z.B. direkt nach "Ölwechsel" suche, findet aber nichts bei der Suche nach "ölwechsel". So als wäre das kleine "ö" ein Nichtwortzeichen?! Zudem darf das Wort jetzt auch nicht mehr am Anfang oder am Ende der Zeichenkette stehen. Das kann man zwar mit
PHP-Code:

" ".$text." " 

wieder umgehen, ist aber wenig elegant. Sorry, aber mit den regulären Ausdrücken kenn ich mich wirklich kaum aus.

h3ll 19-05-2012 13:29

Wortsuche mit preg_match - PHP Forum: phpforum.de


Alle Zeitangaben in WEZ +2. Es ist jetzt 03:30 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG