4 caractères dans une suite de caractère

Eléphanteau du PHP | 10 Messages

10 avr. 2006, 17:58

Jaurais besoin de vérifier que dans une suite de caractère, je n'ai que 4 Caractères différents :

AGTC

C'est en faite pour vérifier que la suite de caractère correspond à une séquence ADN, et dire à l'utilisateur concerné qu'il y a une erreur


Mais je ne vois pas du tout comment faire :(

De plus, j'aimerais forcer la séquence à être en majuscule

Mais je ne sais pas non plus coment faire
(il doit y avoir une fonction spécifique, mais je ne la trouve pas :( )


Un exemple pour que ca soit plus clair :

AGKTCTGATCATGCATCGATCGATGCTGATGCA

La 3eme lettre est un K
Donc pas un A OU T OU G OU C

J'aimerais donc faire ensuite afficher un message comme quoi une erreur s'est glissé dans la séquence

De plus, si l'utilisateur me met une séquence de type
agtctatcgctagctagtgcatactctcgt

J'aimerais la forcer en majuscule pour l'entrer dans une base de donnée (pour que tout soit uniforme en faite)

Merci d'avance ;)


EDIT :

POur les majuscules, j'ai trouvé :

strtoupper()

;)

Eléphant du PHP | 451 Messages

10 avr. 2006, 19:30

Je ne sais pas si c'est la solution la plus élégante mais tu peux construire un tableau indexé par chacun des caractères de ta chaîne à valider puis vérifier la taille du tableau...

J'ai fait un test ça donne ça :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "xhtml11.dtd">

<html>
    <head>
        <title>Essais</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    </head>

    <body>
<?php
reset($_POST);
while (list($key, $val) = each($_POST )) {
	echo "<BR>$key -> $val";
	$$key=$val;
}

if (!isset($_POST['SUITE'])) {
	echo "<FORM action=";
	echo $_SERVER["PHP_SELF"];
	echo " method=\"post\">";
	echo "SUITE ADN : <INPUT TYPE=TEXT NAME=SUITE>";
	echo "</FORM>";
}
else {
	if (strlen($SUITE) != 4) {
		die("<BR>La suite ne fait pas 4  caractères");
	}
	$SUITE=strtoupper($SUITE);
	// On construit un tableau avec chacun des caractères
	unset($TBLCAR);
	for($x=0; $x<strlen($SUITE); $x++) {
		$TBLCAR[substr($SUITE, $x, 1)]++;
	}
//	foreach($TBLCAR as $key => $val) {
//		echo "<BR>kery=".$key." val=".$val;
//	}
	if (count($TBLCAR) != 4) {
		echo "<BR>'".$SUITE."' n'est pas une suite de 4 caractères différents..."; 
	}
	else {
		echo "<BR>'".$SUITE."' OK les 4 caractères sont différents..."; 
	}
}

?>
    </body>
</html> 
J'espère que ça pourra t'aider.
Jpaul
J'essaye d'aider : parfois je fais des erreurs, on me les corrige et j'apprends un peu plus. Super ce forum :)

Eléphant du PHP | 254 Messages

10 avr. 2006, 20:26

majuscules -> strtoupper()

et pour verifier que tu as que des ACGT tu peux utiliser ceci :
preg_match("#^[ACGT]+$#", $stChaine) apres avoir forcé les majuscules

Eléphanteau du PHP | 10 Messages

11 avr. 2006, 14:41

J'ai du mal m'exprimé
parce que d'apres ce que je comprends de vos propositions,
c'est que l'on va vérifier l'existence d'un motif choisi
ce n'est pas cela dont j'ai besoin (même si ca peut m'être tres utile ;) pour autre chose ;))

en faite, je voudrait resteindre l'alphabet à 4 lettres :
A
C
G
T

pour une chaîne de caractère

et que si on trouve une autre lettres, que ca me retroune un message d'erreur ;)

Je vous remercie pour votre participation
Ca me permet d'avoir un debut de piste ;)

(ou alors j'ai pas tout compris :( )

Merci encore ;)

Eléphanteau du PHP | 10 Messages

11 avr. 2006, 14:48

En faite, on pourrait lire la chaîne de caractère, 1 caractère apres l'autre

S'il s'agit d'un A ou d'un T ou d'un G ou d'un C, c'est bon on continue, sinon, on arrete et on affiche un message d'erreur


Je pense que c'est possible

Il faudrait juste que je trouve une fonction ou que je créer un script qui li les chaines de caractères une à une
Pour les entrer dans une variable, et comparer cette variable à A, T G ou C

Merci, encore, je vasi réfléchir la dessus ;)

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

11 avr. 2006, 15:03

L'idée de l'expression régulière de Lorenzo n'est pas idiote, tu peux parfaitement faire un masque qui dit :

uniquement les caractères A, G, T ou C
N fois

Ce sera sûrement plus rapide et plus facilement modifiable qu'une fonction perso

Tu peux regarder le rappel ici : http://www.phpfrance.com/forums/voir_sujet-12979.php

Et utiliser ça pour faire tes tests : www.lumadis.be

Edition :
j'avais même pas regardé mais la solution qu'il t'a donné correspond parfaitement à ce que tu demandes... :oops:

Eléphanteau du PHP | 10 Messages

11 avr. 2006, 15:44

Ah d'accord

Ben c'est cool alors

J'ai aussi trouvé par moi même :

Je remplace les lettre A T G C dans la séquence par 'rien'

$ATGC = array('A','T','G','C');
$verifADN = str_replace($ATGC,"",$recherche);

et je regarde la longueur de la chaîne

$lrecherche=strlen($recherche);


SI elle est égale à zéro, c'est que j'ai bien que des A T G et C
Et donc c'est bon ;)

if ($lverifADN=='0')
{
print "Ceci correspond bien à une séquence ADN.";
}
else {
print "Une erreur s'est glissée dans la recheche.<br>";
print "La recherche ne correspond pas à une séquence ADN.<br>";
};

Et ca marche impécable


En faite l'idée de Lorenzo était la même non ?
Mais j'ai pas tout compris à ce qu'il a écrit :oops:

et ce que j'ai fait, est à mon gout plus simple
(et aussi plus facile avec les connaissances que j'ai :D)

En tout cas, merci à vous trois ;)

J'ai réussi à faire ce que je voulais :)

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

11 avr. 2006, 15:52

Ouais bof
Effectivement ça marche mais alors c'est vraiment tordu

Si je passe derrière toi et que je vois ça je ne comprendrais pas du tout ce que ça fait
Et même avec un commentaire il me faudra un petit temps de réaction et je me dirais "ce mec réfléchi bizarrement !"

La proposition de Lorenzo était la plus simple et la plus logique pour vérifier le format d'une chaîne de caractères

En définissant le masque qui correspond à tes critères :

Code : Tout sélectionner

^[ACGT]+$
Qui se traduit par : la chaîne doit commencer (^) et finir ($) par A, C, G ou T, caractères qui peuvent être présent 1 ou N fois (+)
=> EXACTEMENT ce que tu veux

Il utilise ensuite une fonction PHP qui utilise les expression régulières et qui vérifier si la chaîne passée en paramètre correspond à ce masque, et te renvoie le résultat

C'est donc plus logique, plus lisible, et sûrement plus rapide même si ça ne se voit pas.

C'est l'occasion de comprendre comment fonctionne les expressions régulières en plus. Tu en auras sûrement besoin un jour, et tu ne pourras pas toujours trouver des parades de ce genre...

Je serais toi je laisserais tomber ta solution un peu tordue pour adopter celle-ci :)
C'est le boulot des regex de valider le format d'une chaîne de caractères

Mais c'est bien d'avoir cogité et d'avoir trouvé une solution ceci dit ;)

Eléphanteau du PHP | 10 Messages

11 avr. 2006, 15:55

Ah, oui expliqué comme ca, c'est tout de suite plus simple

Mais c'est plus dure à appliquer pour moi

Pour le moment, je vais le laisser comme ca, et ensuite, quand j'aurias fini ce qui va autour, je verrais si je peux avoir quelque chose de plus logique ;)

Merci

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

11 avr. 2006, 16:03

Tu fais comme tu le sens c'est ton script
Mais c'est plus dure à appliquer pour moi
Si tu as compris mes explications, il n'y a rien de plus à comprendre, tu as juste à recopier son post :lol:
$chaine_ADN = 'ACtTCGTCatgCATACG';
$chaine_ADN = strToUpper($chaine_ADN);
$ADN_valide = preg_match("#^[ACGT]+$#", $chaine_ADN);

if ($ADN_valide == 0) {
   echo "Cette chaîne N'est PAS un code ADN valide";
} else {
      echo "Cette chaîne est un code ADN valide";
}
preg_match() retourne le nombre de fois où le masque pattern a été trouvé. Cela peut aller de 0 (pas de solution) à un 1 car preg_match() s'arrête dès qu'elle a trouvé une première solution.
Pour le moment, je vais le laisser comme ca, et ensuite, quand j'aurias fini ce qui va autour, je verrais si je peux avoir quelque chose de plus logique ;)
Je suis prêt à parier que ça n'arrivera jamais, quand on dit "je ferais mieux plus tard", on n'y revient jamais, quand ça marche on est content et on oublie :lol:

Eléphant du PHP | 254 Messages

18 avr. 2006, 07:43

L'idée de l'expression régulière de Lorenzo n'est pas idiote, tu peux parfaitement faire un masque qui dit :

uniquement les caractères A, G, T ou C
N fois
ben justement c'est exactement ce que mon expression faisait ....

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

18 avr. 2006, 09:23

Oui je sais je me suis repris juste après :
Edition :
j'avais même pas regardé mais la solution qu'il t'a donné correspond parfaitement à ce que tu demandes... :oops: