web-dev-qa-db-fra.com

Supprimer le texte entre parenthèses PHP

Je me demande juste comment je pourrais supprimer le texte entre un ensemble de parenthèses et les parenthèses elles-mêmes en php.

Exemple :

ABC (Test1)

Je voudrais qu'il supprime (Test1) et ne laisse que ABC

Merci

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

preg_replace est une routine de remplacement d'expression régulière basée sur Perl. Ce que fait ce script, c'est qu'il correspond à toutes les occurrences d'une parenthèse ouvrante, suivies de n'importe quel nombre de caractères pas une parenthèse fermante, puis à nouveau suivie d'une parenthèse fermante, puis les supprime:

Ventilation des expressions régulières:

/  - 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
149
cmptrgeekken

La réponse acceptée fonctionne très bien pour les parenthèses non imbriquées. Une légère modification de l'expression régulière lui permet de travailler sur des parenthèses imbriquées.

$string = "ABC (Test1(even deeper) yes (this (works) too)) outside (((ins)id)e)";
echo preg_replace("/\(([^()]*+|(?R))*\)/","", $string);
13
Tegan Snyder
$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);

Il fonctionne en parcourant chaque caractère, en comptant les parenthèses. Seulement quand $paren_num == 0 (quand il est en dehors de toutes les parenthèses) ajoute-t-il les caractères à notre chaîne résultante, $new_string.

12
tyjkenn

sans regex

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

Les gens, les expressions régulières NE PEUVENT PAS être utilisées pour analyser des langages non réguliers. Les langues non régulières sont celles qui nécessitent un état pour être interprétées (c'est-à-dire se souvenir du nombre de parenthèses actuellement ouvertes).

Toutes les réponses ci-dessus échoueront sur cette chaîne: "ABC (bonjour (monde) comment vas-tu)".

Lisez Parsing Html de Jeff Atwood The Cthulhu Way: https://blog.codinghorror.com/parsing-html-the-cthulhu-way/ , puis utilisez un analyseur écrit à la main (boucle les caractères de la chaîne, voir si le caractère est une parenthèse ou non, conserver une pile) ou utiliser un lexeur/analyseur capable d'analyser un langage sans contexte.

Voir également cet article wikipedia sur la "langue des parenthèses correctement appariées:" https://en.wikipedia.org/wiki/Dyck_language

4
Alex Weinstein
$str ="ABC (Test1)";    
echo preg_replace( '~\(.*\)~' , "", $str );      
2
Naga

La plupart des méthodes quik (sans preg):

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

Si vous ne souhaitez pas supprimer les espaces à la fin de Word, supprimez simplement la fonction de suppression du code.

2
MERT DOĞAN