Trouver plusieurs chaîne différentes dans une séquence...

pinoche29
Invité n'ayant pas de compte PHPfrance

14 mai 2010, 15:08

Entre les orf qu'il trouve.

Exemple :

AGC AUG AAA AGC UAG AGC AUG AGC GGA UAG
Là il m'affiche : AUGAAAAGCUAGAUGAGCGGAUAG

Et je voudrais : AUGAAAAGCUAG AUGAGCGGAUAG

ViPHP
ViPHP | 5462 Messages

14 mai 2010, 15:10

Entre les orf qu'il trouve.

Exemple :

AGC AUG AAA AGC UAG AGC AUG AGC GGA UAG
Là il m'affiche : AUGAAAAGCUAGAUGAGCGGAUAG

Et je voudrais : AUGAAAAGCUAG AUGAGCGGAUAG
c'est que je te disais avec chunk_split ;)

pinoche29
Invité n'ayant pas de compte PHPfrance

14 mai 2010, 20:17

Ah ok, dsl, mais à quoi servait ton "3" alors ?

Encore un problème, en réalité le codon stop peut-être soit UAG soit UGA soit UAA... Et dans ce cas là /AUG(?:[ACGU]{3}(?<!UAG))+UAG/u devient quoi ?
Il faut faire intervenir des barres verticales (dont je ne connais pas le nom lol) non ?

ViPHP
ViPHP | 5462 Messages

14 mai 2010, 20:21

Ah ok, dsl, mais à quoi servait ton "3" alors ?
le 3 c'est que tout les 3 caractères il va faire un espace
Encore un problème, en réalité le codon stop peut-être soit UAG soit UGA soit UAA... Et dans ce cas là /AUG(?:[ACGU]{3}(?<!UAG))+UAG/u devient quoi ?
Il faut faire intervenir des barres verticales (dont je ne connais pas le nom lol) non ?
arf ca se complique
sans testé je dirais
/AUG(?:[ACGU]{3}(?<!U(?:AG|GA|AA)))+U(?:AG|GA|AA)/u

pinoche29
Invité n'ayant pas de compte PHPfrance

14 mai 2010, 21:42

Merci, ta regexp marche par contre avec $value il ne m'affiche que la première chaîne trouvée... comment faire pour qu'il les mette toutes en sachant que je ne sais pas forcément combien il y en aura ?

(Voici mon code)

Code : Tout sélectionner

preg_match_all('/AUG(?:[ACGU]{3}(?<!U(?:AG|GA|AA)))+U(?:AG|GA|AA)/u', $arn, $tableau); foreach ($tableau[0] as &$value); echo "<br/><br/><div id='orf'><h1>ORF : </h1>ORF obtenus : $value<br/><br/>";

ViPHP
ViPHP | 5462 Messages

14 mai 2010, 23:08

t'as une chaine complète pour que je puisse tester :wink:

pinoche29
Invité n'ayant pas de compte PHPfrance

14 mai 2010, 23:13

CCCAUGGGGGGGGGGUAGCCCAUGAAAAAAAAAUGACCCAUGGGGGGGUAACCC

Voilà normalement tu obtiens 3 séquences et aucun C.

ViPHP
ViPHP | 5462 Messages

15 mai 2010, 00:01

CCCAUGGGGGGGGGGUAGCCCAUGAAAAAAAAAUGACCCAUGGGGGGGUAACCC

Voilà normalement tu obtiens 3 séquences et aucun C.
$arn = 'CCCAUGGGGGGGGGGUAGCCCAUGAAAAAAAAAUGACCCAUGGGGGGGUAACCC';
preg_match_all('/AUG(?:[ACGU]{3}(?<!U(?:AG|GA|AA)))+U(?:AG|GA|AA)/u', $arn, $tableau);
foreach ($tableau[0] as $value)
{
    $orf = chunk_split($value, 3, ' ');
    echo "<br/><br/><div id='orf'><h1>ORF : </h1>ORF obtenus : $orf<br/><br/>";
}

Code : Tout sélectionner

ORF : ORF obtenus : AUG GGG GGG GGG UAG ORF : ORF obtenus : AUG AAA AAA AAA UGA ORF : ORF obtenus : AUG GGG GGG UAA

pinoche29
Invité n'ayant pas de compte PHPfrance

15 mai 2010, 23:43

Nan, ça m'affiche toujours que le premier orf... Ca vient pas du "$tableau (0)" .

pinoche29
Invité n'ayant pas de compte PHPfrance

15 mai 2010, 23:45

J'ai oublié le "?"... Ca vient pas du $tableau(0) ? lol (Je mets pas des parenthèses dans mon code mais j'ai un mac donc je ne les ai pas sur mon clavier lol)

ViPHP
ViPHP | 5462 Messages

16 mai 2010, 15:57

J'ai oublié le "?"... Ca vient pas du $tableau(0) ? lol (Je mets pas des parenthèses dans mon code mais j'ai un mac donc je ne les ai pas sur mon clavier lol)
fais un var_dump($tableau)

sinon pour les crochets faut faire shift-alt + parenthese

pinoche29
Invité n'ayant pas de compte PHPfrance

16 mai 2010, 17:12

Raaaah mais j'ai toujours le même problème qui me tape sur le système !!

J'ai ce code là comme vous me l'avait dit :

Code : Tout sélectionner

preg_match_all('/AUG(?:[ACGU]{3}(?<!U(?:AG|GA|AA)))+U(?:AG|GA|AA)/u', $arn, $tableau); foreach ($tableau[0] as &$value); { echo "<br/><br/><div id='orf'><h1>ORF : </h1>ORF obtenus : $value<br/><br/>"; }
Mais avec $value : IL NE M'AFFICHE QUE LE PREMIER ORF QU'IL TROUVE !!
Sur ma séquence : CCCAUGGGGGGGGGGUAGCCCAUGAAAAAAAAAUGACCCAUGGGGGGGUAACCC
Il ne m'affiche que l'orf en rouge alors qu'il y en a deux autres après et qu'il les trouve puisqu'avec pint_r ($tableau) il me les affiche tous !!

ViPHP
ViPHP | 5462 Messages

16 mai 2010, 17:16

faut pas mettre de ; apres le foreach :wink:

pinoche29
Invité n'ayant pas de compte PHPfrance

16 mai 2010, 17:37

Ah oui merci !! :)

Bon ben là je crois que je vais arriver à la fin de mes problèmes, je n'ai plus que deux petites questions :

J'ai cette regexp là pour le start AUG et le stop UAG ou UGA ou UAA : '/AUG(?:[ACGU]{3}(?<!U(?:AG|GA|AA)))+U(?:AG|GA|AA)/u'
Par contre si le stop peut être : UGA ou AGA ou AGG que devient " !U(?:AG|GA|AA)))+U(?:AG|GA|AA) " ?

et ma dernière question : Comment puis-je obtenir la longueur de tous les orfs ? (La longueur de chacun des orfs additionnée)
Je sais que pour avoir la longueur d'une chaîne la fonction c'est strlen($chaine) mais si je fais strlen($value) je n'ai que la longueur du premier orf...

Exemple :

Code : Tout sélectionner

foreach ($tableau[0] as &$value) { echo "$value"; }
La si je mets ensuite strlen($value) il va correspondre qu'a la longueur d'un seul orf non ?

ViPHP
ViPHP | 5462 Messages

16 mai 2010, 17:44

J'ai cette regexp là pour le start AUG et le stop UAG ou UGA ou UAA : '/AUG(?:[ACGU]{3}(?<!U(?:AG|GA|AA)))+U(?:AG|GA|AA)/u'
Par contre si le stop peut être : UGA ou AGA ou AGG que devient " !U(?:AG|GA|AA)))+U(?:AG|GA|AA) " ?
ca serais comme ca
/AUG(?:[ACGU]{3}(?<!(?:UAG|AGA|AGG)))+(?:UAG|AGA|AGG)/u
et ma dernière question : Comment puis-je obtenir la longueur de tous les orfs ? (La longueur de chacun des orfs additionnée)
Je sais que pour avoir la longueur d'une chaîne la fonction c'est strlen($chaine) mais si je fais strlen($value) je n'ai que la longueur du premier orf...

Exemple :

Code : Tout sélectionner

foreach ($tableau[0] as &$value) { echo "$value"; }
La si je mets ensuite strlen($value) il va correspondre qu'a la longueur d'un seul orf non ?
2 solutions sois tu crees un valiable $compteur par exemple et tu addition les valeur
$compteur = 0;
foreach ($tableau[0] as &$value)
{
$compteur += strlen($value);
}

echo $compteur;
sois avec les fonctions de tableau
echo array_sum(array_map('strlen', $tableau[0]));