2010-02-01 8 views

cevap

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

preg_replace bir perl tabanlı düzenli ifade rutini değiştirir. Bu kodun yapmasıdır karakterler değil bir kapatma parantezi herhangi bir sayıda takip ve tekrar kapanan parantez ardından bir açılış parantez tüm oluşumları ile eşleşir ve sonra bunları siler:

Düzenli ifade dökümü:

regex olmadan
/ - 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 Hızlı cevap! Teşekkürler! Biraz açıklamak ister misiniz? Yaptığın şeyi gerçekten anlamadım. –

+0

Karakter sınıfınızda) denemelisiniz. – mopoke

+0

Normal bir ifade. Bunu açıklamak çok zor. – metrobalderas

11

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

Hızlı ve kirli. Bunu sevdim. –

4

Millet, düzenli ifadeler olmayan düzenli dilleri ayrıştırmak için kullanılan EDİLEMEZ. Normal olmayan diller, yorumlanması gereken durumlardır (yani şu anda kaç tane parantezin açık olduğunu hatırlamak).

Yukarıdaki tüm yanıtlar bu dizede başarısız olacaktır: "ABC (merhaba (dünya) nasılsınız".

Oku Jeff Atwood Ayrıştırma Html Cthulhu Yolu: http://www.codinghorror.com/blog/archives/001311.html ve sonra ya bir tarafından el yazılı ayrıştırıcı kullanmak (dizede karakterler aracılığıyla döngü, karakter bir parantez olup olmadığını bir yığın korumak bakınız) veya kullanım Bağlamsız bir dili ayrıştırabilen bir lexer/parser. "Düzgün eşleşti parantez dilinde:" http://en.wikipedia.org/wiki/Dyck_language

+2

PHP'nin normal ifadeleri normal dillerle sınırlı değildir. '\ (([^()] * + | (? R)) * \)' keyfi olarak yuvalanmış parantezleri eşleştirir. –

+0

İyi belirtme çizgisi. Konuyla ilgili kapsamlı bilgi: 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); 

Bu parantez sayma, her karakterin bir döngü ile çalışır

Ayrıca bu wikipedia makalesine bakın. Yalnızca $paren_num == 0 (tüm parantezlerin dışında olduğunda), karakterleri sonuçtaki dizgimize, $new_string'a ekler.

+0

Harika, teşekkür ederim ^^ – whitesiroi

5

Kabul edilen yanıt, yuvalanmamış parantezler için harika çalışıyor. Normal ifadede küçük bir değişiklik, iç içe parantez üzerinde çalışmasına izin verir. (Preg olmadan)

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

En Quik yöntemi:

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

Eğer kelimenin sonundaki boşluk Döşeme sadece koddan Trim fonksiyonunu kaldırmak istemiyorsanız

.

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