PHP: le Meilleur moyen pour extraire du texte à l'intérieur de la parenthèse?
Quel est le meilleur/le plus efficace pour extraire le texte mis entre parenthèse? Dire que je voulais passer à la chaîne "texte" de la chaîne "ignorer tout sauf ce (texte)" dans la manière la plus efficace possible.
Jusqu'à présent, le meilleur que j'ai trouvé est: est-ce
$fullString = "ignore everything except this (text)";
$start = strpos('(', $fullString);
$end = strlen($fullString) - strpos(')', $fullString);
$shortString = substr($fullString, $start, $end);
Est-il une meilleure façon de le faire? Je sais, en général, en utilisant les regex tend à être de moins en moins efficace, mais si je peux réduire le nombre d'appels de fonction, peut-être que ce serait la meilleure approche? Pensées?
- Vous pouvez trouver
s($fullString)->between("(", ")")
utile, que l'on trouve dans cette bibliothèque autonome.
Vous devez vous connecter pour publier un commentaire.
je venais de faire une regex et d'en finir avec. sauf si vous faites un nombre suffisant d'itérations qu'il devient un énorme problème de performances, il est plus facile de coder (et de comprendre quand vous regardez en arrière sur elle)
Donc, en fait, le code que vous avez posté ne fonctionne pas:
substr()'s
paramètres sont $string, $start et $longueur, etstrpos()'s
paramètres sont$haystack
,$needle
. Légèrement modifiée:Quelques subtilités: j'ai utilisé
$start + 1
dans le paramètre offset afin d'aider PHP tout en faisant de lastrpos()
de recherche sur la deuxième parenthèse; on incrémente$start
l'un et de réduire$length
à exclure les parenthèses du match.Aussi, il n'y a pas de contrôle d'erreur dans ce code: vous voudrez vous assurer que
$start
et$end
n' === false avant d'effectuer lasubstr
.Comme pour l'utilisation de
strpos/substr
contre regex; en terme de performance, ce code va battre une expression régulière mains vers le bas. C'est un peu wordier bien. Je mange et respirestrpos/substr
, donc je n'ai pas l'esprit que c'est trop, mais quelqu'un d'autre peut préférez la compacité d'une regex.Utiliser une expression régulière:
Ceci est un exemple de code pour extraire tout le texte entre '[' et ']' et de le stocker 2 tableaux distincts(c'est à dire le texte à l'intérieur des parenthèses dans un tableau et le texte en dehors des parenthèses dans un autre tableau)
De sortie:
extract_text("bonjour comment allez-vous?");
produira:
extract_text("bonjour [http://www.google.com/test.mp3] comment êtes-vous?");
produira
Cette fonction peut être utile.
strpos() => qui est utilisé pour trouver la position de la première occurence dans une chaîne de caractères.
strrpos() => qui est utilisé pour trouver la position de la première occurence dans une chaîne de caractères.
c'est un peu d'amélioration à la réponse précédente qui sera de retour tous les modèles dans la matrice de la forme:
getStringsBetween('[T]son[] est [test] string [pattern]') sera de retour:
Déjà posté regex solutions -
\((.*?)\)
et\(([^\)]+)\)
- ne retournez pas le plus profond chaînes entre l'ouvrir et de fermer les parenthèses. Si une chaîne estText (abc(xyz 123)
ils les deux de retour un(abc(xyz 123)
comme tout le match, et pas(xyz 123)
.Le modèle qui correspond à des sous-chaînes (à utiliser avec
preg_match
pour aller chercher de la première et de lapreg_match_all
pour aller chercher toutes les occurrences), entre parenthèses, sans autres d'ouvrir et de fermer les parenthèses entre les deux est, si le match doit inclure des parenthèses:Ou, vous souhaitez obtenir les valeurs sans parenthèses:
Remplacer
*
avec+
si il doit y avoir au moins 1 char entre(
et)
.Détails:
\(
- une ouverture ronde crochet (doit être échappé pour désigner un littéral entre parenthèses comme il est utilisé en dehors d'une classe de caractères)[^()]*
- zéro ou plus des caractères autres que des(
et)
(note ces(
et)
n'ont pas échappé à l'intérieur d'une classe de caractères à l'intérieur d'elle,(
et)
ne peut pas être utilisé pour spécifier un groupement et sont traités comme des littérale parenthèses)\)
- une parenthèse fermante (doit être échappé pour désigner un littéral entre parenthèses comme il est utilisé en dehors d'une classe de caractères).La
\(\K
partie dans un autre regex correspond(
et omet de le match de la valeur (avec le\K
match de réinitialisation de l'opérateur).(?<=\()
est positif lookbehind qui nécessite un(
apparaissent immédiatement à la gauche de la position actuelle, mais la(
n'est pas ajouté au match de la valeur depuis lookbehind (lookaround) les motifs ne sont pas de la consommer.(?=\()
est une anticipation positif qu'implique un)
char à apparaître immédiatement à la droite de l'emplacement actuel.Le code PHP:
De sortie: