2011-09-10 5 views
4

J'essaye de supprimer une chaîne groupée par type (seulement ALPHA ou DIGIT), sans aucun autre caractère.Division d'une chaîne par groupe [ALPHA] [DIGIT] [ALPHA]

Je travaille en PHP, et j'aimerais utiliser REGEX.

J'ai besoin de convertir une chaîne d'entrée comme "ES-3810/24MX" à un tableau comme [ES] [3810] [24] [MX], et une chaîne d'entrée comme "CISCO1538M "à un tableau comme [CISCO] [1538] [M].

La séquence de fichier d'entrée peut être indifféremment DIGITS ou ALPHA.

Les séparateurs peuvent être des caractères non-ALPHA et non-DIGIT, ainsi qu'un changement entre une séquence DIGIT vers une séquence APLHA, et vice versa.

Désolé pour mon pauvre anglais ... espérons que mon explication semble claire, cependant.

Merci pour votre aide.

Cordialement.

+0

La réponse que vous avez accepté a un bogue. – tchrist

Répondre

3

La commande pour correspondre à toutes les occurrences d'une regex est preg_match_all() qui produit un tableau de résultats multidimensionnel. La regex est très simple ... n'importe quel chiffre ([0-9]) une ou plusieurs fois (+) ou (|) une lettre ou plusieurs fois ([A-z]) une ou plusieurs fois (+). Notez les majuscules A et minuscules z pour inclure toutes les lettres majuscules et minuscules.

Les balises textarea et php sont incluses pour plus de commodité, vous pouvez donc les placer dans votre fichier php et voir les résultats.

<textarea style="width:400px; height:400px;"> 
<?php 

foreach(array(
     "ES-3810/24MX", 
     "CISCO1538M", 
     "123ABC-ThatsHowEasy" 
    ) as $string){ 

    // get all matches into an array 
    preg_match_all("/[0-9]+|[[:upper:][:lower:]]+/",$string,$matches); 

    // it is the 0th match that you are interested in... 
    print_r($matches[0]); 

} 

?> 
</textarea> 

qui produit dans la zone de texte:

Array 
(
    [0] => ES 
    [1] => 3810 
    [2] => 24 
    [3] => MX 
) 
Array 
(
    [0] => CISCO 
    [1] => 1538 
    [2] => M 
) 
Array 
(
    [0] => 123 
    [1] => ABC 
    [2] => ThatsHowEasy 
) 
+0

Super! C'est assez bon pour moi, Billy. Merci beaucoup. Ce fut la partie manquante pour moi de créer une requête sur une grande base de données pour rechercher facilement des produits formatés mal, et de détecter les éléments en double avec différents formats. Très utile. – mlh

+0

** REPONSE INCORRECTE ** Veuillez arrêter d'utiliser '[A-z]', bon sang. Il a des choses que vous ne voulez pas et n'a pas de choses que vous faites. Les majuscules sont '\ p {Lu}', et les minuscules sont '\ p {Ll}'. – tchrist

+0

Bien sûr, vous avez raison, j'ai mis à jour ma réponse, j'espère que vous appréciez mon '[[: upper:] [: lower:]]' un peu plus que mon '[Az]' –

1
$str = "ES-3810/24MX35 123 TEST 34/TEST"; 
$str = preg_replace(array("#[^A-Z0-9]+#i","#\s+#","#([A-Z])([0-9])#i","#([0-9])([A-Z])#i"),array(" "," ","$1 $2","$1 $2"),$str); 
echo $str; 
$data = explode(" ",$str); 
print_r($data); 

Je ne pouvais pas penser d'une manière plus «propre».

+0

Merci Renato. C'est résolu pour moi. – mlh