2010-02-01 44 views
44

Me pregunto cómo podría eliminar el texto entre un conjunto de paréntesis y los paréntesis mismos en php.Eliminar texto entre paréntesis PHP

Ejemplo:

ABC (Prueba1)

me gustaría que para borrar (Prueba1) y sólo dejar ABC

Gracias

Respuesta

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

preg_replace es un habitual basado en Perl expresión reemplazar rutina. Lo que hace este script es coincide con todas las ocurrencias de un paréntesis de apertura, seguido de cualquier número de caracteres no un paréntesis de cierre, y de nuevo seguido de un paréntesis de cierre, y luego los elimina:

desglose Expresión regular:

/ - 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 Respuesta rápida! ¡Gracias! ¿Te importaría explicarlo un poco? Realmente no entiendo lo que has hecho. –

+0

No deberías tratar de escapar de) en tu clase de personaje. – mopoke

+0

Es una expresión regular. Es un poco difícil de explicar jeje. – metrobalderas

11

sin expresiones regulares

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

Rápido y sucio. Me gusta. –

4

La gente, las expresiones regulares no se pueden utilizar para analizar lenguajes no regulares. Los idiomas no regulares son aquellos que requieren un estado para interpretar (es decir, recordar cuántos paréntesis están actualmente abiertos).

Todas las respuestas anteriores fallarán en esta cadena: "ABC (hola (mundo) cómo estás)".

Lea Jeff Atwood's Parsing Html The Cthulhu Way: http://www.codinghorror.com/blog/archives/001311.html, y luego use un analizador escrito a mano (recorra los caracteres en la cadena, vea si el carácter es un paréntesis o no, mantenga una pila) o use un lexer/analizador capaz de analizar un lenguaje sin contexto.

también ver este artículo de Wikipedia sobre el "lenguaje de los paréntesis se ajustan correctamente:" http://en.wikipedia.org/wiki/Dyck_language

+2

Las expresiones regulares de PHP no están limitadas a los idiomas regulares. '\ (([^()] * + | (? R)) * \)' coincide paréntesis anidados arbitrariamente bien. –

+0

Buena llamada. Amplia información sobre el tema: 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); 

Funciona mediante un bucle a través de cada carácter, contando entre paréntesis. Solo cuando $paren_num == 0 (cuando está fuera de todos los paréntesis) agrega los caracteres a nuestra cadena resultante, $new_string.

+0

Impresionante, gracias ^^ – whitesiroi

5

La respuesta aceptada funciona muy bien para paréntesis no anidados. Una ligera modificación de la expresión regular le permite trabajar en paréntesis anidados.

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

método más Quik (sin preg):

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

Si no desea recortar espacios al final de la palabra, basta con retirar función de ajuste de código.

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