2011-06-13 2 views
3

J'ai essayé de comprendre comment convertir la chaîne sous la chaîne en plusieurs lignes où il va ajouter une virgule après deux lettres consécutives. Anyhelp est apprécié.en utilisant regex et php

$myLine = "1234:21:3AB3459435:2343RT23432523:CD"; 
$myLine= preg_replace('/((?<=\[a-zA-Z]\b))/', ',', $myLine); 

sortie serait

1234:21:3AB, 
3459435:2343RT, 
23432523:CD, 

THanks, jp

J'aime toutes les réponses, j'apprécie tout le monde tangue pour aider et couru à travers toutes les différentes façons d'obtenir cela travail. C'est incroyable ce que php regexp peut faire une chose de tellement de façons différentes. Merci à tous encore!

+2

Voulez-vous dire 2 lettres consécutives ou deux/même/lettres (comme AA, ABB) –

+0

aux lettres consécutives comme dans la chaîne ci-dessus, il y a AB RT CD etc ...le résultat final serait 1234: 21: 3AB, 3459435: 2343RT, 23432523: CD, la nouvelle ligne serait après la virgule (désolé à ce sujet) – jpp

+1

Il manque quelques détails. Qu'est-ce qui est avec les "lignes multiples"? Pouvez-vous éditer et publier la sortie attendue, afin que nous n'ayons pas à deviner? – netcoder

Répondre

2

Voici quelque chose que j'ai trouvé rapidement.

$myLine = "1234:21:3AB3459435:2343RT23432523:CD"; 
$myLine= preg_replace('/([a-zA-Z]{2})/', "$1,\n", $myLine); 

Sorties:

1234:21:3AB, 
3459435:2343RT, 
23432523:CD, 

Ou, si vous ne voulez pas que la virgule de fin:

$myLine = "1234:21:3AB3459435:2343RT23432523:CD"; 
$myLine= preg_replace('/([a-zA-Z]{2}(?!$))/', "$1,\n", $myLine); 

Sorties:

1234:21:3AB, 
3459435:2343RT, 
23432523:CD 
+0

peut quatrième position de retour à trois de longueur être dépouillé en même temps ou je vais devoir utiliser une autre expression rationnelle ainsi par exemple obtenir 21 :, 234, 523? – jpp

+0

@jpp: Je le ferais dans une regex séparée. Ou mieux encore, vous pouvez 'substr' pour obtenir la gamme de caractères que vous voulez. –

+0

mais la sous-chaîne à l'arrière de la chaîne est-elle possible? – jpp

1

Je ne sais pas où vous voulez que les nouvelles lignes, mais pour autant que les lettres consécutives vont, ce serait quelque chose comme:

$myLine= preg_replace('/([a-zA-Z]{2})/', '$1,', $myLine); 
2
$myLine = "1234:21:3AB3459435:2343RT23432523:CD"; 
$myLine = preg_replace('/([a-z]{2})/i', '$1,', $myLine); 
0

Ajouter {2} pour le faire correspondre exactement deux fois .

/((?<=[a-zA-Z]{2}))/ 

En outre, vous pouvez utiliser \w pour tout caractère de mot.

/((?<=\w{2}\b))/ 
1

Quelque chose comme cela devrait fonctionner pour vous:

preg_replace('~([a-z]{2})~i', "$1,", $myLine) 
1

essayez ceci:

$myLine = "1234:21:3AB3459435:2343RT23432523:CD"; 
$myLine= preg_replace("/([a-z]{2})/i","$1,\n", $myLine); 
0

Je vais avoir un peu de mal interpréter votre question. En supposant que vous voulez dire que vous souhaitez que vos données d'échantillons de "1234: 21: 3AB3459435: 2343RT23432523: CD" à convertir en "1234: 21: 3AB, 3.459.435: 2343RT, 23432523: CD":

$myLine= preg_replace('/([a-zA-Z]{2})/','$1,',$myLine); 

devrait travail. Le motif correspond exactement à deux caractères d'une ligne et les parenthèses qui l'entourent rendent cette correspondance accessible en tant que référence dans le remplacement. Le remplaçant prend alors les deux caractères appariés et met juste une virgule après eux. Voir http://us.php.net/manual/en/function.preg-replace.php pour plus de détails.

Si vous voulez que le résultat soit plusieurs lignes (par exemple pour une sortie plus jolie), changez simplement l'expression de remplacement pour inclure une nouvelle ligne, par ex.

$myLine= preg_replace('/([a-zA-Z]{2})/','$1'.",\n",$myLine);