2010-02-01 21 views
44

Mi chiedo solo come avrei potuto rimuovere il testo tra una serie di parentesi e le stesse parentesi in php.Rimuovere testo tra parentesi PHP

Esempio:

ABC (Test1)

lo vorrei cancellare (Test1) e lasciare solo ABC

Grazie

risposta

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

preg_replace è un perl-base regolare espressione sostituire la routine. Ciò che questo script non fa altro che soddisfa tutte le occorrenze di una parentesi di apertura, seguita da un numero qualsiasi di caratteri non una parentesi chiusa, e ancora una volta seguito da una parentesi chiusa, e poi li elimina:

regolare ripartizione espressione:

/ - 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 Risposta veloce! Grazie! Ti dispiacerebbe spiegarlo un po '? Non capisco davvero quello che hai fatto. –

+0

Non si dovrebbe cercare di sfuggire alla) nella classe di caratteri. – mopoke

+0

È un'espressione regolare. È piuttosto difficile spiegare hehe. – metrobalderas

11

senza espressione regolare

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

Veloce e sporco. Mi piace. –

4

gente, le espressioni regolari non possono essere utilizzati per analizzare lingue non regolari. Le lingue non regolari sono quelle che richiedono lo stato per interpretare (vale a dire ricordare quante parentesi sono attualmente aperte).

Tutte le risposte di cui sopra non riusciranno su questa stringa: "ABC (ciao (mondo) come stai)".

di Leggi Jeff Atwood parsing del codice HTML Il Cthulhu Way: http://www.codinghorror.com/blog/archives/001311.html, e quindi utilizzare un parser scritto da mano (ciclo attraverso i caratteri della stringa, vedere se il carattere è una parentesi o meno, mantenere uno stack) o l'uso un lexer/parser in grado di analizzare un linguaggio privo di contesto.

veda anche questo articolo di Wikipedia sulla "lingua di parentesi correttamente abbinati:" http://en.wikipedia.org/wiki/Dyck_language

+2

Le regex di PHP non sono limitate alle lingue regolari. '\ (([^()] * + | (? R)) * \)' corrisponde a parentesi annidate arbitrariamente. –

+0

Buon richiamo. Informazioni complete sull'argomento: 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); 

Funziona loop attraverso ogni personaggio, contando parentesi. Solo quando $paren_num == 0 (quando si è al di fuori tutte le parentesi) lo fa aggiungere il caratteri alla nostra stringa risultante, $new_string.

+0

Impressionante, grazie ^^ – whitesiroi

5

La risposta accettata grandi opere per parentesi non nidificate. Una leggera modifica alla regex gli permette di lavorare su parentesi annidate.

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

metodo Quik La maggior parte (senza preg):

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

Se non si vuole tagliare gli spazi alla fine della parola, è sufficiente rimuovere funzione trim dal codice.

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