l'éditeur php Banana vous présentera une méthode pour extraire la valeur d'une chaîne avec des crochets imbriqués en PHP. Au cours du développement, nous rencontrons parfois des situations dans lesquelles nous devons extraire des valeurs spécifiques d'une chaîne complexe, et ces valeurs peuvent être imbriquées dans plusieurs parenthèses. Cet article vous montrera comment utiliser les fonctions de traitement de chaînes, la récursivité et les expressions régulières de PHP pour résoudre ce problème. Que vous soyez débutant ou développeur expérimenté, cet article vous fournira des conseils pratiques et des exemples de code pour vous aider à aborder ce type de tâche en toute simplicité.
Étant donné une chaîne d'entrée, par exemple :
AB[C[DA,BF,GAL],DB[NX,AQQ,AAN,B],F[H[GG,BAND]]]
Tableau de chaînes de retour :
["ABCDA", "ABCBF", "ABCGAL", "ABDBNX", "ABDBAQQ", "ABDBAAN", "ABDBB", "ABFHGG"]
J'ai pu écrire une solution partielle, mais s'il y en a plusieurs [children]
, il est difficile de garder une trace du nœud parent.
Une autre chaîne de test : ZHLADAOR[R[G[45D[COI,EMA],Q5D[COI,EMA],U5D[COI,EMA],Y5D[COI,EMA]],HE5D[COI,EMA]], SG[A5D[COI,EMA],E5D[COI,EMA],I5D[COI,EMA]]]
<code>func expandNestedString(str string) []string { var parts []string var currentPart []rune var openBrackets int var level int var bitsBeforeComma int var prevBitsBeforeComma int for _, char := range str { if char == '[' { openBrackets++ level++ prevBitsBeforeComma = bitsBeforeComma bitsBeforeComma = 0 } else if char == ']' { openBrackets-- if openBrackets == 0 { if level == 0 && len(currentPart) > 0 { parts = append(parts, string(currentPart)) } currentPart = []rune{} level-- } else { parts = append(parts, string(currentPart)) currentPart = currentPart[:len(currentPart)-(bitsBeforeComma+prevBitsBeforeComma)] bitsBeforeComma = 0 } } else if char == ',' { parts = append(parts, string(currentPart)) currentPart = currentPart[:len(currentPart)-bitsBeforeComma] bitsBeforeComma = 0 } else { currentPart = append(currentPart, char) bitsBeforeComma++ } } if len(currentPart) > 0 { parts = append(parts, string(currentPart)) } return parts } </code>
Souvent, ces problèmes qui semblent nécessiter un équilibrage des parenthèses ou le suivi des modèles de caractères précédents peuvent être bien résolus avec la récursivité. C'est une solution efficace
func expand(s []rune, idx int) ([][]rune, int) { var prefix []rune var result [][]rune for ; idx < len(s); idx++ { switch s[idx] { case '[': runes, lastIdx := expand(s, idx+1) for _, r := range runes { result = append(result, append(prefix, r...)) } idx = lastIdx prefix = []rune{} case ']': if len(prefix) > 0 { result = append(result, prefix) } return result, idx case ',': if len(prefix) > 0 { result = append(result, prefix) prefix = []rune{} } default: prefix = append(prefix, s[idx]) } } if len(prefix) > 0 { result = append(result, prefix) } return result, idx } func expandNestedString(s string) []string { runes, _ := expand([]rune(s), 0) var result []string for _, r := range runes { result = append(result, string(r)) } return result }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!