php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 06.01.2011, 00:22  
Neuer Benutzer
 
Registriert seit: 06.01.2011
Beiträge: 5
PHP-Kenntnisse:
Fortgeschritten
partizan befindet sich auf einem aufstrebenden Ast
Standard REGEXP es dürfen u.a. keine Umlaute folgen

Einen (ganz frühen) guten Morgen zusammen!

Wahrscheinlich ist das für jene, die sich mit REGEXP auskennen eine Kleinigkeit, ich probiere schon einen ganzen Tag und komme zu keinem befriedigenden Ergebnis.

Mein Stand der Dinge ist
dings REGEXP '[^a-zA-ZäöüßÄÖÜ]*".$bums."[^a-zA-ZäöüßÄÖÜ]*'
Das soll 'übersetzt' bedeuten
in dings soll nach $bums gesucht werden, wobei $bums [weder Kleinbuchstaben, noch Großbuchstaben noch Umlaute und "ß" in beliebiger Zahl] voranstehen oder folgen.

Es wäre nett, wenn mir jemand sagen könnte, wie es besser lauten sollte, so dass es funktioniert.

Vielen herzlichen Dank!
partizan
partizan ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 06.01.2011, 00:51  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.268
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Für MySQL?

Erstmal würde ich preg_quote($bums) schreiben. Statt deinem vorher/nachher Teil benutz Lookahead/Lookbehind-Assertions. Suchst du vielleicht \b (Wortgrenze)? Volltextsuche, LIKE???
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 06.01.2011, 09:08  
Neuer Benutzer
 
Registriert seit: 06.01.2011
Beiträge: 5
PHP-Kenntnisse:
Fortgeschritten
partizan befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Chriz Beitrag anzeigen
Für MySQL?
na klar - so spare ich mir den späteren Einzelabgleich...

Zitat:
Zitat von Chriz Beitrag anzeigen
Erstmal würde ich preg_quote($bums) schreiben.
...was mir allerdings genau diese Möglichkeit nimmt...

Die MySql-Abfrage ist wesentlich umfangreicher, als dieser kleine Ausschnitt, aber die anderen Bestandteile funktionieren ja, weshalb ich das hier nicht ansprach. Vom Ablauf her verfahre ich so, dass ich mit der MySQL-Abfrage ca. 400.000 Datensätze durchsuche und lediglich diejenigen akzeptiere, welche gewisse Grundbedingungen erfüllen. Die Treffer kommen dann in ein Array, dass ich mit preg_match und anderen nach weiteren Bedingungen filtere.

Zitat:
Zitat von Chriz Beitrag anzeigen
Statt deinem vorher/nachher Teil benutz Lookahead/Lookbehind-Assertions.
Kenn ich nicht, finde ich nur Sachen bzgl. Perl dazu.

Zitat:
Zitat von Chriz Beitrag anzeigen
Suchst du vielleicht \b (Wortgrenze)? Volltextsuche, LIKE[/url]???
du willst gar nicht wissen (oder gar lesen), was ich alles schon versucht habe... letztlich geht es ja um die Frage, wie die Anweisung lautet, mit dem ich heraus filtere, dass Groß-/Kleinbuchstaben und Umlaute vor oder hinter dem Item stehen. LIKE verwende ich auch, kann dabei meines Erachtens aber "Groß-/Kleinbuchstaben und Umlaute" nicht ausgrenzen.

Trotzdem Danke!
partizan
partizan ist offline   Mit Zitat antworten
Alt 06.01.2011, 13:36  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.268
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von partizan Beitrag anzeigen
Kenn ich nicht, finde ich nur Sachen bzgl. Perl dazu.
Ist doch sch* ob das fuer Perl oder nicht ist, RegExp ist groesstenteils allgemeingueltig. Wenn ich fuer andere googlen muss werd ich echt stinkig. Als ob man das nicht selbst machen koennte.
http://www.google.com/search?sourcei...ead+assertionl
(gleich die erste Seite)

Vermutlich ist dein Datenbankkonzept falsch, aber willst ja nix verraten.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 06.01.2011, 13:50  
Neuer Benutzer
 
Registriert seit: 06.01.2011
Beiträge: 5
PHP-Kenntnisse:
Fortgeschritten
partizan befindet sich auf einem aufstrebenden Ast
Standard

hab mittlerweile dazu gelesen und auch ausprobiert.

dings REGEXP '(?![a-zA-ZäöüßÄÖÜ])".$bums."(?![a-zA-ZäöüßÄÖÜ])')
als Ergebnis erhalte ich eine MySQL-Fehlermeldung

übrigens ist mir mittlerweile aufgefallen, dass die Unzulänglichkeit von
dings REGEXP '[^a-zA-ZäöüßÄÖÜ]*".$bums."[^a-zA-ZäöüßÄÖÜ]*'
genau dann auftritt, wenn $bums unmittelbar an ein "ü" stößt. Ich nehme mal an, dass dies auch im Fall anderer Umlaute so ist, dass also die Negation [^ beim ü nicht funktioniert...

Ich habe nicht darum gebeten, dass du für mich googelst. Ich habe darum gebeten, dass mir jemand mit REGEXP hilft, wenn sie oder er dazu etwas weiß.
partizan ist offline   Mit Zitat antworten
Alt 06.01.2011, 15:48  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.268
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Achso, fällt mir grade auf: evtl. unterstützt MySQL Assertions nicht. Kannst du nochmal beschreiben warum du so komplexe Suchen benötigst, vielleicht findet sich eine bessere Lösung?! Wenn du einen MySQL-Fehler erhältst, schau dir halt mal das Query und die Fehlermeldung an ...
Zitat:
als Ergebnis erhalte ich eine MySQL-Fehlermeldung
Du postest deinen PHP-Code, der ist ziemlich uninteressant, wenn MySQL meckert.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 06.01.2011, 16:49  
Erfahrener Benutzer
 
Benutzerbild von fireweasel
 
Registriert seit: 20.03.2010
Beiträge: 474
PHP-Kenntnisse:
Fortgeschritten
fireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblick
fireweasel eine Nachricht über ICQ schicken fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken fireweasel eine Nachricht über Skype™ schicken
Standard

Zitat:
übrigens ist mir mittlerweile aufgefallen, dass die Unzulänglichkeit von
dings REGEXP '[^a-zA-ZäöüßÄÖÜ]*".$bums."[^a-zA-ZäöüßÄÖÜ]*'
genau dann auftritt, wenn $bums unmittelbar an ein "ü" stößt. Ich nehme mal an, dass dies auch im Fall anderer Umlaute so ist, dass also die Negation [^ beim ü nicht funktioniert...
Und ich nehme mal an, dass du Zeichensatzkodierungen durcheinandergewürftelt hast. Das führt dazu, dass dein "ü" in der verwendeten Kodierung als irgendwas anderes als ein Buchstabe erkannt wird (zwei Zeichen in UTF-8 beispielsweise).

Zitat:
Zitat von partizan Beitrag anzeigen

Mein Stand der Dinge ist
dings REGEXP '[^a-zA-ZäöüßÄÖÜ]*".$bums."[^a-zA-ZäöüßÄÖÜ]*'
Das soll 'übersetzt' bedeuten
in dings soll nach $bums gesucht werden, wobei $bums [weder Kleinbuchstaben, noch Großbuchstaben noch Umlaute und "ß" in beliebiger Zahl] voranstehen oder folgen.
Es sollte genügen, wenn dein RegEx auf das Nichtvorhandensein EINES "Nichtbuchstaben" vor und nach dem Suchbegriff prüft. Die Sterne sind also unsinnig. Wenn dein RegEx-Dialekt keine Assertions unterstützt, kannst du das auch mit einfachen negierten Zeichenklassen machen.

MySQL scheint zwar keine Assertions, dafür aber POSIX-Character-Classes zu unterstützen.

http://dev.mysql.com/doc/refman/5.5/en/regexp.html

Aber bevor du das Kodierungsproblem nicht gelöst hast, lohnt es sich nicht, Gedanken zu machen, warum der RegEx nicht "matcht" ...

Geändert von fireweasel (06.01.2011 um 17:09 Uhr).
fireweasel ist offline   Mit Zitat antworten
Alt 06.01.2011, 16:56  
Neuer Benutzer
 
Registriert seit: 06.01.2011
Beiträge: 5
PHP-Kenntnisse:
Fortgeschritten
partizan befindet sich auf einem aufstrebenden Ast
Standard

warum ich so komplexe Suchen benötige:
Ich habe >400.000 Datensätze, die zwei Trefferqualitäten besitzen.
Die erste Qualität ist "passt" oder "passt nicht", also true oder false
Die zweite Qualität ist "passt gut" oder "passt schlecht".

Für die erste verwende ich die SQL-Abfrage und reduziere die 400.000 auf z.B. 1.000 Treffer. Diese Treffer packe ich in ein Array, welches danach teilweise mehrfach durchlaufen und nach "gut" oder "schlecht" gefiltert wird.

Konkret geht es um Bauteile für Fahrzeuge. Wobei sich die Fahrzeuge in ihren Modellnamen oft nur minimal unterscheiden. Da gibt es dann das Modell
Liberty 1.6, das Modell Liberty 1.6i und das Modell Liberty 1.8. Wenn ich nun Bauteile haben will, die beim 1.6i passen, kann ich ja schlecht nach "i" suchen, weil das immer in Liberty gefunden wird. Wenn ich jedoch sage es darf kein Buchstabe/Umlaut direkt davor oder dahinter stehen, dann bekomme ich bei suche nach "1.6" und "i" nur die Treffer für Liberty 1.6i - comprendre?

Die Fehlermeldung ist zeimlich unspektakulär:
mysql_num_rows(): supplied argument is not a valid MySQL result resource 131
wobei in 131 die Anweisung REGEXP '(?![a-zA-ZäöüßÄÖÜ])".$bums."(?![a-zA-ZäöüßÄÖÜ])') steht.

Schöne Grüße
partizan
partizan ist offline   Mit Zitat antworten
Alt 06.01.2011, 17:00  
Neuer Benutzer
 
Registriert seit: 06.01.2011
Beiträge: 5
PHP-Kenntnisse:
Fortgeschritten
partizan befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von fireweasel Beitrag anzeigen
das Nichtvorhandensein EINES "Nichtbuchstaben
neee! Das Vorhandensein von 0 oder mehr Zeichen, die nicht [a-zA-ZäöüßÄÖÜ] sind. Für den Fall dass das gesuchte Item unmittelbar am Beginn des Satzes steht, hilft mir eine Abfrage nach Vorhandensein eines Nichtbuchstabens nix.
partizan ist offline   Mit Zitat antworten
Alt 06.01.2011, 17:41  
Erfahrener Benutzer
 
Benutzerbild von fireweasel
 
Registriert seit: 20.03.2010
Beiträge: 474
PHP-Kenntnisse:
Fortgeschritten
fireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblick
fireweasel eine Nachricht über ICQ schicken fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken fireweasel eine Nachricht über Skype™ schicken
Standard

So, letzer Versuch. Kann man dieses bescheuerte Sicherheiz-Token nicht abschalten oder wenigstens das Zeitfenster verlängern? *grrrrrrr*

Zitat:
Zitat von partizan Beitrag anzeigen
neee! Das Vorhandensein von 0 oder mehr Zeichen, die nicht [a-zA-ZäöüßÄÖÜ] sind. Für den Fall dass das gesuchte Item unmittelbar am Beginn des Satzes steht, hilft mir eine Abfrage nach Vorhandensein eines Nichtbuchstabens nix.
MySQL kennt die String-Anfang|Ende-Assertions "^" und "$".

http://dev.mysql.com/doc/refman/5.5/...-matching.html

Nehmen wir mal an, es kennt auch Alternative Subpatterns:

REGEXP '(^|[^[:alpha:]])word([^[:alpha:]]|$)'

Sollte dann funktionieren. Der "gematchte" String muss dann allerdings oft noch von den Zeichen vor oder hinter dem "bums" gereinigt werden. Wenn man irgendwie an die Subpatterns rankommt, ist das aber machbar.

Update:
Es geht viel einfacher. Wenn man die Wortgrenzen-Spezialklassen benutzt:

REGEXP '[[:<:]]word[[:>:]]'

http://dev.mysql.com/doc/refman/5.5/en/regexp.html (am Ende der Seite)

Zitat:
Die Fehlermeldung ist zeimlich unspektakulär:
mysql_num_rows(): supplied argument is not a valid MySQL result resource 131
wobei in 131 die Anweisung REGEXP '(?![a-zA-ZäöüßÄÖÜ])".$bums."(?![a-zA-ZäöüßÄÖÜ])') steht.
Die Fehlermeldung kommt daher, weil du vergessen hast, das Query-Ergebnis darauf zu prüfen, ob es sich auch um ein Resultset handelt. Also mit is_resource($result) testen, bevor du mysql_num_rows() darauf loslässt. Wenn ein Fehler aufgetreten ist, kannst du dann den Fehlercode und die dazugehörige Fehlermeldung abfragen. Die dürften aussagekräftiger sein als die PHP-Fehlermeldung.

Geändert von fireweasel (06.01.2011 um 20:37 Uhr).
fireweasel ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Umlaute werden nicht erkannt Phoenix@ PHP Tipps 2010 8 30.08.2010 11:05
Regexp: An Suchstring dürfen keine Buchstaben angrenzen flowyn33 Datenbanken 5 09.07.2010 15:57
[Erledigt] PHPMailer und Umlaute Sirius PHP Tipps 2010 14 30.03.2010 15:14
Umlaute und MySQL4.1 Datenbanken 2 15.11.2009 15:28
Umlaute mit Request richtig übertragen Lebenssonde JavaScript, Ajax und mehr 4 28.07.2009 15:10
[Erledigt] Kann keine Umlaute im mysql client eingeben Oger Datenbanken 9 02.04.2009 11:54
MySQL Konsole und Umlaute unter Windows [LÖSUNG] f4ckm5 Datenbanken 8 30.03.2009 22:10
[Erledigt] Umlaute und Sonderzeichen decodieren Sermon PHP Tipps 2009 9 27.03.2009 08:18
Umlaute und str_replace MatzeMuc86 PHP Tipps 2008 20 22.10.2008 20:41
Umlaute in Datenbank zerschossen. Wie reparieren? MatzeMuc86 Datenbanken 1 14.09.2008 17:48
Umlaute in Datenbank Eldra PHP Tipps 2008 3 14.05.2008 07:11
regexp umlaute und sprach bezogene Zeichen. JEGO PHP Tipps 2008 9 05.11.2007 15:47
UTF8 Dump erzeugt nach import in UTF8 kod DB falsche Umlaute Carino Datenbanken 18 07.05.2007 23:49
Umlaute bei Linux flual2000 PHP Tipps 2006 10 28.04.2006 13:12
Umlaute... JK PHP-Fortgeschrittene 7 07.12.2005 20:55

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
regex umlaute, mysql regexp, http://www.php.de/php-fortgeschrittene/75793-regexp-es-duerfen-u-keine-umlaute-folgen.html, mysql regexp umlaute, php regex umlaute, regex keine umlaute, mysql regexp umlaut, mysql regex umlaute, umlaute in regex, javascript regex umlaute, mysql regexp sonderzeichen, regexp mysql, regex keine sonderzeichen in wort, regexp umlaute, php regex umlaute werden nicht erkannt, regex umlaut, regexp umlauts, javascript regexp umlaute, php regex keine sonderzeichen, regex word characters umlaut

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:20 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum