2016-05-22 19 views
0

Wie kann ich einen Quantifizierer innerhalb einer Zeichenklasse hinzufügen? Dies ist mein derzeitiger regulärer Ausdruck und was ich erreichen möchte (abgesehen davon, was es gerade tut) ist, dass Whitespaces und Dots (mit einem oncurrence von mehr als 2) abgeglichen und schließlich mit der Funktion preg_replace entfernt werdenenthalten Quantifizierer in Zeichenklasse

aktuelle regulärer Ausdruck:

[^A-Za-z0-9\s.\'\(\)\-\_] 

gewünschte Lösung (den Quantifizierer bemerkt {1}):

[^A-Za-z0-9\s{1}.{1}\'\(\)\-\_] 

Input (das hat zu filternde):

Hi, this is a text.......that has to be [email protected]#! 

Ausgang (Nach dem regulären Ausdruck):

Hi this is a textthat hasto be filtered 
+1

Dies ist nicht möglich, könnte man für so etwas wie '[^ A-Za-z0-9 \ s werden gesucht . '() _-] | [\ s.] {2,} ' –

+0

@SebastianProske Also müsste ich 3 verschiedene reguläre Ausdrücke ausführen, um meine gewünschte Lösung zu erhalten? Da der reguläre Ausdruck, den du mir geschickt hast, eine Alternative enthalten hat * – Testuser075

+0

zeige die Eingabezeichenfolge und die erwartete Ausgabe (Ergebnis) – RomanPerekhrest

Antwort

1

Es gibt keine Möglichkeit für einen Quantifizierer innerhalb einer Zeichenklasse. Jedoch Sie Abwechslung und normalen Quantoren, wie

$str = "Hi, this is a text.......that has to be [email protected]#!"; 
$pattern = "/[^A-Za-z0-9\\s.'()_-]|\\.{3,}|\\s{3,}/"; 
$subst = ""; 
print(preg_replace($pattern, $subst, $str)); 

Ausgänge verwenden: Hi this is a textthat hasto be filtered

Sie könnten auch die Zeichenklasse [^\\w\\s.'()-]

In der Regex verkürzen [^A-Za-z0-9\\s.'()_-] alle Zeichen übereinstimmt, die nicht alphanumerische oder Leerzeichen ist oder Punkt oder runde Klammer oder Apostroph oder Unterstrich oder Minus. \\.{3,} entspricht jedem Punkt mit einem Vorkommen von 3 oder mehr (mehr als 2). \\s{3,} entspricht allen Leerzeichen mit einem Vorkommen von 3 oder mehr (mehr als 2) - beachten Sie, dass dies z. leere Registerkarte leer, da dies alle Leerzeichen sind.

Mit der leeren String-Substitution wird alles Matched durch eine leere Zeichenfolge ersetzt (also entfernt).

+0

Hey, danke für deine Idee. Ich habe es geschafft, es mit dem folgenden regulären Ausdruck zu fixieren: \. {2,} | \ s {2,} | [^ A-Za-z0-9. \ '\ (\) \ - \ _] - Ich bin echt noob bei regulären Ausdrücken, könntest du mir also erklären, was du tust? – Testuser075

0

Eine andere Lösung mit preg_replace_callback Funktion:

$str = "Hi, this is a text.......that has to be [email protected]#!"; 

$replaced = preg_replace_callback(
     ["/(\s{3,}|\.{3,})/" , "/[^A-Za-z0-9\s.'()_-]/" ], 
     function($m) { return ""; }, 
     $str); 

print_r($replaced); 

Der Ausgang:

Hi this is a textthat hasto be filtered