2009-04-09 5 views
6

J'ai un tableau avec quelques informations. Par exemple:PHP: comment obtenir uniquement les mots entre parenthèses() et effacer tout le reste

(scénariste) &

ou

avec (dialogue additionnel)

Je veux nettoyer ce donc je ne reçois que le texte entre les parenthèse() et efface tout le reste

résultat:

écrivain

ou

dialogue supplémentaire

+0

Copie possible de [PHP: meilleure façon d'extraire le texte entre parenthèses?] (Https://stackoverflow.com/questions/196520/php-best-way-to-extract-text-within-parenthesis) – EdChum

Répondre

7
$string = "this (is (a) test) with (two parenthesis) duh"; 

Pour une chaîne comme cela, vous pouvez utiliser preg_match_all et utiliser imploser. Ou vous pouvez utiliser preg_replace, mais avec des parenthèses multiples, vous perdrez les espaces entre eux.

$regex = '#[^()]*\((([^()]+|(?R))*)\)[^()]*#'; 
$replacement = '\1'; 
echo preg_replace($regex, $replacement, $string); 

j'ai eu beaucoup d'aide de cette page, Finer points of PHP regular expressions.

+0

Intéressant, je ne savais pas que PHP supportait les expressions régulières récursives. –

+0

Également assertions, références arrières et conditions. Vous pouvez le lire ici: http://php.net/manual/fr/regexp.reference.php#regexp.reference.back-references – OIS

+0

L'URL dans cette réponse est maintenant morte mais à partir de cet extrait, vous pouvez dire qu'il y a beaucoup à apprendre de cela. J'ai donc cherché [une version enregistrée] (http://web.archive.org/web/20120403035903/http://www.skdevelopment.com/php-regular-expressions.php) de la machine de wayback au cas où quelqu'un intéressé à voir ce que d'autres goodies sont là –

12

La meilleure façon sera avec une expression régulière:

preg_match_all('/\((.*?)\)/', $input, $matches); 

$matches[1], $matches[2], etc. contiendra tout ce qui se trouvait entre parenthèses dans $ input. C'est-à-dire, $matches[1] aura tout ce qui était entre le premier ensemble de parenthèses, et ainsi de suite (pour gérer les cas avec plusieurs ensembles).

+0

" Le plus simple sera avec une expression régulière: "... pas si vous voulez équilibrer les parenthèses! Comment pensez-vous que le PO veut traiter "ceci (est un (un) test)"?Votre regex correspond à "is (a") Aussi, il est plus rapide (je pense) de faire/[^)] * \)/que de faire /.*?/ pour obtenir du texte entre parenthèses. –

+1

S'il avait spécifié qu'il pourrait y avoir des parenthèses imbriquées, je n'aurais pas suggéré regex. Mais il semble avoir affaire à une entrée plutôt simple. Ecrire un analyseur quand une expression régulière d'une ligne fera le même travail est exagéré. –

1
$matches = array(); 
$num_matched = preg_match_all('/\((.*)\)/U', $input, $matches); 
1
function getInbetweenStrings($start, $end, $str){ 
    $matches = array(); 
    $regex = "/$start([a-zA-Z0-9_]*)$end/"; 
    preg_match_all($regex, $str, $matches); 
    return $matches[1]; 
} 

pour examle vous voulez le tableau de chaînes (touches) entre {} à suivre exemple, où '/' ne tombe pas entre

$str = "C://{ad_custom_attr1}/{upn}/{samaccountname}"; 
$str_arr = getInbetweenStrings('{', '}', $str); 

print_r($str_arr); 
0

L'utilisation ci-dessus dans un

remplacer
echo preg_replace('/\(([\w]{1,2})\)/',"(s\\1)",'(Gs) Main Hall'); 

résultats dans

Questions connexes