2010-02-01 14 views

Odpowiedz

118
$string = "ABC (Test1)"; 
echo preg_replace("/\([^)]+\)/","",$string); // 'ABC ' 

preg_replace jest Perl opartych na regularne wyrażenie zamień rutynę. Co ten skrypt robi to pasuje do wszystkich wystąpień nawiasem otwierającym, a następnie przez dowolną liczbę znaków nie nawias zamykający, i znowu następuje nawias zamykający, a następnie usuwa je:

Zwykły podział wyrażenie:

/ - opening delimiter (necessary for regular expressions, can be any character that doesn't appear in the regular expression 
\(- Match an opening parenthesis 
[^)]+ - Match 1 or more character that is not a closing parenthesis 
\) - Match a closing parenthesis 
/- Closing delimiter 
+1

wow: O Szybka odpowiedź! Dzięki! Czy mógłbyś wytłumaczyć to trochę? Naprawdę nie dostaję tego, co zrobiłeś. –

+0

Nie powinieneś próbować uciec) w twojej klasie postaci. – mopoke

+0

To wyrażenie regularne. Trudno to wyjaśnić hehe. – metrobalderas

11

bez regex

$string="ABC (test)" 
$s=explode("(",$string); 
print trim($s[0]); 
+0

Szybkie i brudne. Lubię to. –

4

Folks, wyrażenia regularne nie mogą być używane do analizowania nieregularnie języków. Języki nienormalne to te, które wymagają interpretacji stanu (tj. Pamiętanie, ile nawiasów jest obecnie otwartych).

Wszystkie powyższe odpowiedzi zakończą się niepowodzeniem w tym ciągu: "ABC (cześć (świat) jak się masz").

Przeczytaj Jeff Atwood za analizowaniem HTML Cthulhu Way: http://www.codinghorror.com/blog/archives/001311.html, a następnie użyć albo przez ręki napisany parser (pętla za pośrednictwem znaków w ciągu, sprawdzić, czy znak jest nawias lub nie utrzymują stos) lub użycie lexer/parser zdolny do analizowania języka bez kontekstu.

patrz wikipedia również ten artykuł o „języku właściwie dopasowane nawiasie:” http://en.wikipedia.org/wiki/Dyck_language

+2

Wyrażenia PHP nie są ograniczone do zwykłych języków. '\ (([^()] * + | (? R)) * \)' dopasowuje nawiasy zagnieżdżone dowolnie dobrze. –

+0

Dobre objaśnienie. Obszerne informacje na ten temat: http://php.net/manual/en/regexp.reference.recursive.php –

10
$string = "ABC (Test1(even deeper) yes (this (works) too)) outside (((ins)id)e)"; 
$paren_num = 0; 
$new_string = ''; 
foreach($string as $char) { 
    if ($char == '(') $paren_num++; 
    else if ($char == ')') $paren_num--; 
    else if ($paren_num == 0) $new_string .= $char; 
} 
$new_string = trim($new_string); 

Działa poprzez zapętlenie poprzez każdego znaku, licząc nawiasów. Tylko gdy $paren_num == 0 (gdy znajduje się poza wszystkimi nawiasami), dodaje znaki do naszego wynikowego ciągu, $new_string.

+0

Awesome, thank you^^ – whitesiroi

5

Przyjęta odpowiedź działa doskonale w nawiasach bez zagnieżdżonych. Nieznaczna modyfikacja wyrażenia regularnego pozwala mu pracować nad nawiasami zagnieżdżonymi.

$string = "ABC (Test1(even deeper) yes (this (works) too)) outside (((ins)id)e)"; 
echo preg_replace("/\(([^()]*+|(?R))*\)/","", $string); 
0

Większość Quik metoda (bez PREG):

$str='ABC (TEST)'; 
echo trim(substr($str,0,strpos($str,'('))); 

Jeśli nie chcesz, aby przyciąć spacji na końcu słowa, po prostu usunąć wykończenia funkcji z kodu.

1
$str ="ABC (Test1)";  
echo preg_replace('~\(.*\)~' , "", $str);  
Powiązane problemy