2016-06-29 12 views
1

Ich habe eine Einfügen-Abfrage, die verschiedene Wörter in eine Suchtabelle für die Verwendung in einer Stichwortsuche für meine Website basierend auf vorhandenen Inhalten aus anderen Tabellen hinzugefügt.Entfernen Sie Zahlen und kurze Wörter aus den Suchbegriffen

Mein Problem ist, dass, obwohl ich eine gemeinsame Wörter Textdatei habe, die Wörter wie "und" und "die" ausschließt, möchte ich auch Zahlen und Wörter mit weniger als 3 Zeichen Länge zu beseitigen.

Kann jemand helfen?

$stripChars = array('.', ',', '!', '?', '(', ')', '%', '&', '"', '*', ':', ';', '@', ' - ', '/', '\\'); 
$string = str_replace($stripChars, ' ', $string); 

$string = str_replace(' ', ' ', $string); 
$words = explode(' ', $string); 

return array_diff($words, $this->commonwords); 

Antwort

1

Sie können tun, was Sie versuchen, mit zu erreichen ein strukturierter Regex-Aufruf, in PHP mit der Funktion preg_replace. Doch am Code auf Ihrer Frage suchen gibt es eine Menge, die einfach durch den Einsatz des richtigen Regex mit der preg_replace Funktion verbessert werden kann:

$stripChars = array('.', ',', '!', '?', '(', ')', '%', '&', '"', '*', ':', ';', '@', ' - ', '/', '\\'); 
$string = str_replace($stripChars, ' ', $string); 

Lets face it, das ist nicht sehr zu artikulieren ansehen. Angenommen, Sie sind einfach zu entfernen Nicht-alphanumerische Zeichen versucht, dies vereinfacht werden kann bis auf:

$string = preg_replace("/[^a-z0-9_\s-]/i","",$string); 

Welche PHP sagt alle Zeichen zu ersetzen, die sind nicht (durch die ^ Karat): az (die /i zeigt Groß- und Kleinschreibung an) und nicht 0-9 und nicht Unterstrich _ und kein Leerzeichen \s oder ein Strich -. Diese werden dann durch nichts ersetzt (zweiter String-Abschnitt) und werden so effektiv entfernt.

Sie können natürlich anpassen, was in den eckigen Klammern erscheint, um Ihren Bedürfnissen zu entsprechen (siehe später, da dies vorkommen wird ...).

zu diesem nächsten Abschnitt Hinzufügen in:

$string = str_replace(' ', ' ', $string); 

Welche Sie ersetzen möchten mehrere Räume mit einem einzigen Leerzeichen, wieder zu sein scheint, kann preg_replace diese schön tun und für Sie prägnant :

$string = preg_replace("/\s+/", " ",$string); 

Wo \s das Leerzeichen, und die + Zeichen zeigt an ret Urn "gierig und so viele wie möglich".

Und Ihre ursprüngliche Anfrage, die zum Entfernen von Zahlen und Wörtern von 2 oder weniger Zeichen war, preg_replace kann den Code aus Teil 1 dieser Antwort verwenden, um einfach auch Zahlen einzuschließen, indem Sie Zahlen aus dem [^a-z0-9_\s-] Block weglassen, also: [^a-z_\s-] Nummern werden jetzt entfernt.

Um kurze Wörter entfernen Sie verwenden können:

$string = preg_replace("/\b[a-z]{1,2}\b/i","",$string); 

Diese definierte skizzieren Wörter mit einer Wortgrenze \b und dann, dass jede Sammlung dieser Zeichen in den eckigen Klammern [a-z] der Länge zwischen mindestens 1 und maximal 2 {1,2} sollte markiert werden, und die \i macht es wieder Groß-und Kleinschreibung, so dass diese Worte entfernt.

sie alle zusammen haben Sie dann Wrapping:

///remove anything that is not letters or underscore or whitespace 
$string = preg_replace("/[^a-z_\s-]/i","",$string); 
/// remove short words 
$string = preg_replace("/\b[a-z]{1,2}\b/i","",$string); 
/// finally remove excess whitespaces 
$string = preg_replace("/\s+/", " ",$string); 

Die Entfernung von Whitespaces zuletzt den Raum auf jeder Seite des Wortes kurze Worte zu fassen ist als das Entfernen so also Leerzeichen verursacht mehr Blöcke verlassen würde.

Es kann durchaus eine Möglichkeit geben, die Regex zu einer einzigen (oder zumindest weniger) Abfrage zu kombinieren, aber ich bin nicht sehr gut darin, Regex-Aufrufe zu kombinieren, fürchte ich. Aber der obige Code ist viel klüger, sauberer und leistungsfähiger als Ihr aktueller Code. Neben der Beantwortung Ihrer Frage.

EDIT:

So entfernen Sie nur Zahlen speziell können Sie den folgenden preg_replace Code verwenden:

$string = preg_replace("/\d+/","",$string); 
+0

Vielen Dank für diese informierte Antwort. Wirklich appreciate es. Ihre Lösung funktioniert großartig. – user3189734

2

können Sie diese verwenden, um Wörter zu entfernen weniger als 3 Zeichen:

$replaced = preg_replace('~\b[a-z]{1,2}\b\~', '', $text); 

auch diese verwenden, um Zahlen zu entfernen:

$replaced = preg_replace('/[0-9]+/', '', $text); 
+0

Entfernen Nummern können auch mit dem '\ d' Wildcard Spezifizierer – Martin

+0

@ Martin geschehen ist richtig , Vielen Dank! –

+0

Ich würde auch vorschlagen, dass Sie Ihre Wortentfernung case insensitive machen, da Ihr aktuelles Beispiel 'At' nicht entfernt würde. – Martin

Verwandte Themen