2012-02-09 17 views
8

Rozważmy następujący ciąg:Jak pozwolić regexowi zignorować wszystko między nawiasami?

I have been driving to {Palm.!.Beach:100} and it . was . great!! 

używam następujące regex, aby usunąć wszystkie znaki interpunkcyjne:

$string preg_replace('/[^a-zA-Z ]+/', '', $string); 

This Wyjścia:

I have been driving to PalmBeach and it was great!! 

Ale muszę regex zawsze ignorować cokolwiek jest pomiędzy {i}. Tak pożądany wynik byłby:

I have been driving to {Palm.!.Beach:100} and it was great 

Jak mogę pozwolić regex ignorować to, co jest między {i}?

+0

Możliwy duplikat [Stolica wszystkiego z wyjątkiem gdy w nawiasach] (http://stackoverflow.com/questions/9229030/lowercase-everything-except-when-between-brackets) – hakre

Odpowiedz

11

Spróbuj

[^a-zA-Z {}]+(?![^{]*}) 

Zobacz here on Regexr

Środki pasuje do niczego, co nie jest zawarte w zanegowanej klasy postaci, ale tylko wtedy, gdy nie ma nawiasu zamykającego naprzód bez otwierania wcześniej, jest to zrobione przez negatywną uprzedzkę (?![^{]*}).

$string preg_replace('/[^a-zA-Z {}]+(?![^{]*})/', '', $string); 
+0

Mój błąd - zapomniałem, że wszystko, co nie jest pomiędzy nawiasami, powinno zostać zwrócone małymi literami. Co więcej, to, co znajduje się pomiędzy nawiasami, pozostaje samo. Czy to możliwe, aby regex zwrócił resztę małymi literami? – Pr0no

+0

Powiedziałbym, że nie w tym samym preg_replace. Ale w drugim kroku nie ma problemu. Sprawdź to [link] (http://de2.php.net/manual/en/functions.anonymous.php) powinno zacząć. Jeśli masz problemy, zadaj nowe pytanie. – stema

4
$str = preg_replace('(\{[^}]+\}(*SKIP)(*FAIL)|[^a-zA-Z ]+)', '', $str); 

Zobacz także Split string by delimiter, but not if it is escaped.

+0

doszedłem do nieco [podobny wnioski] (http://stackoverflow.com/a/9260679/367456) (w oparciu o połączoną odpowiedź;)) w (jak teraz widzę) duplikacie pytania. – hakre

+0

Yay, +100 dla '(* SKIP) (* F)'! ... @ Pr0no to jest naprawdę użyteczna i interesująca technika, [this] (http://stackoverflow.com/q/23589174/) wyjaśnia to szczegółowo. :) – zx81

Powiązane problemy