begin process at 2012 05 27 21:21:53
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Chaîne de caratère

 > FONCTION QUI RENVOIE UNE CHAINE DIFFERENTIELLE

FONCTION QUI RENVOIE UNE CHAINE DIFFERENTIELLE


 Information sur la source

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Chaîne de caratère Classé sous :chaine, différence, comparer Niveau :Débutant Date de création :25/11/2005 Date de mise à jour :27/11/2005 12:07:17 Vu :3 401

Auteur : guill76

Ecrire un message privé
Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

 Description

Voilà ne maîtrisant pas bien les expressions régulières et ayant parcouru en vain les fonctions de string du php à la recherche d'une fonction renvoyant la chaine differentielle de 2 chaines comparée ,je me suis lancé:

Source

  • <?php
  • function differential_str($refstr , $comparestr) {
  • //on parcours la chaine de reference
  • $reflength=strlen($refstr);
  • for ( $i=0 ; $i<$reflength && $refstr[$i]==$comparestr[$i] ; $i++ ){
  • }
  • // si la totalité de la chaine est parcourue on continue sinon on retourne -1
  • if ( $i == $reflength ) {
  • $diff="";
  • $complength=strlen($comparestr);
  • //Boucle sur la chaine differentielle
  • for ($j=$i ; $j < $complength ; $j++) {
  • //$diff va stocker le surplus de la chaine comparée
  • $diff .= $comparestr[$j];
  • }
  • if ($diff=="")
  • return 0; //les 2 chaines sont identiques
  • else return $diff;//la chaine differentielle
  • }
  • else return -1 ; //la chaine que l'on compare ne commence pas par la chaine de reference
  • }
  • echo ( differential_str("salut","salut les gars") );//retourne " les gars"
  • echo ( differential_str("salut","salut") );//retourne 1
  • echo ( differential_str("salut","rien à voir") );//retourne -1
  • ?>
<?php
function differential_str($refstr , $comparestr) {
  //on parcours la chaine de reference 
  $reflength=strlen($refstr);
  for ( $i=0 ; $i<$reflength && $refstr[$i]==$comparestr[$i] ; $i++ ){
  
  }  
  
  // si la totalité de la chaine est parcourue on continue sinon on retourne -1
  
  if  ( $i == $reflength ) { 
    $diff="";
    $complength=strlen($comparestr);
    //Boucle sur la chaine differentielle
    for ($j=$i ; $j < $complength ; $j++) {
      
      //$diff va stocker le surplus de la chaine comparée
      $diff .= $comparestr[$j];
      
    }
    
    if ($diff=="")
      return 0; //les 2 chaines sont identiques
    else return $diff;//la chaine differentielle
          
  }
  else return -1 ; //la chaine que l'on compare ne commence pas par la chaine de reference 

} 
echo ( differential_str("salut","salut les gars") );//retourne " les gars"
echo ( differential_str("salut","salut") );//retourne 1
echo ( differential_str("salut","rien à voir") );//retourne -1
?>



 Historique

26 novembre 2005 12:40:15 :
optimisation des boucles
27 novembre 2005 12:07:17 :
changement valeur de retour 0 au lieu de 1 quand les 2 chaînes sont égales: c'est plus logique pardon.

 Sources du même auteur

CLASSE FEUILLE DE TEMPS PHP5
PHP 5 CLASSES DE REDIRECTION DES EXCEPTIONS DANS UN SYSTÈME...
[PHP5]AUTHENTICATION MANAGER
Source avec Zip Source avec une capture PHP 5 CLASSE CALENDRIER QUI RENVOIE LA DATE CLIQUÉE DANS 1 É...
Source avec Zip Source avec une capture PHP5 CLASSE ARBRE INVERSÉ (HUFFMAN) COMPRESSION DECOMPRESSIO...

 Sources de la même categorie

ADRESSE ABSOLUE DE LA PAGE EN COURS, AVEC VARIABLES $_GET par Dariumis
Source avec Zip CLASSE D'OBJET DE RECHERCHE DE MOTS DANS DES TABLEAUX ET/OU ... par 8Tnerolf8
RÉCUPÉRER LES MINIATURES D'UNE VIDÉO YOUTUBE par tefa24600
Source avec Zip Source avec une capture CONVERTISSEUR DE NOMBRES EN TEXTE par macruz
Source avec Zip Source avec une capture CODAGE TEXTE >HTML, ISO, SPECIALCHARS, URL ET DECODAGE par Salva9473

 Sources en rapport avec celle ci

SÉCURISATION DE FORMULAIRE par ultimacsplayer
OPTIMISATION DE CHAINE POUR RÉÉCRITURE D'URL par crocxx2
RENVOI UN DOSSIER DE NOM UNIQUE ET ALÉATOIRE par porciner
Source avec Zip CLASSE DE COUPAGE DE TEXTE HTML AVEC CONSERVATION DES BALISE... par Bloodscalp
FILTRE À GROS MOTS POUR LIVRE D'OR par armenak

Commentaires et avis

Commentaire de Anthomicro le 25/11/2005 20:17:48

Salut,

plutôt que de parser toute la chaîne pour savoir si elles sont identiques ou pas, utilise la fonction strcmp($chaine1,$chaine2)

ensuite dans les boucles mets une variable $nb=count($machin);

while($i<$nb)
{

$i++;
}

plutôt que for($machin=0;$machin<count($blabla);$machin++)
{

}

Commentaire de Naixn le 26/11/2005 11:32:40

Question con, mais pourquoi est-il mieux de faire
$nb = count($machin);
while ($i < $nb)
{
// Statement
$i++
}

plutôt que :

for ($nb = count($machin), $i = 0; $i < $nb; $i++)
{
// Statement
}

?

Commentaire de guill76 le 26/11/2005 12:25:46

Mais il me semble que la focnction strcmp parse aussi toute la chaine non?

Commentaire de Naixn le 26/11/2005 12:29:11

Oui, mais ne retourne en aucun cas le texte qui est en plus dans l'une des deux chaînes comparées :)
Regarde ses exemples, il me semble pourtant qu'ils soient assez clairs :-/

Commentaire de FhX le 26/11/2005 12:29:27

Nan, c'est parce que quand tu utilises count() dans une boucle, il va te recompter à chaque fois ton tableau.
Donc, tu le fais avant :)

Commentaire de Naixn le 26/11/2005 12:30:55

Je sais bien, c'est bien pour ça que dans mon for, je le fais à l'initialisation :)

Commentaire de guill76 le 26/11/2005 12:34:57

Ok c'est vrai je vais modifier

Commentaire de malalam le 29/11/2005 09:29:45 administrateur CS

Hello,

j'ai du mal avec ta fonction :

echo ( differential_str("salut","les gars : salut") );//retourne -1
echo ( differential_str("salut","hey, salut les gars") );//retourne -1

Bref, ta fonction ne fonctionne que si la chaîne $comparestr débute par  $refstr.
Quel intérêt alors par rapport à une fonction comme strstr() ? A part que tu renvoie 1 ou -1 selon si les chaînes  sont égales ou ne sont pas comparables ?
echo substr (strstr ('salut les gars', 'salut'), strlen('salut'));
fait la même chose que ta fonction.
Et même, si on suit ton raisonnement, faire un vrai différentiel entre 2 chaînes (on peut même ajouter la gestion de la casse facilement) :

<?php
function strDiff ($haystack, $needle) {
  if (false !== ($pos = strpos ($haystack, $needle))) {
    $retour = substr_replace($haystack, '', $pos, strlen($needle));
    if ($retour === '') {
      return $retour = 1;
    }
    return $retour;
  }
  return $retour = -1;
}
echo strDiff ('hey, salut les gars !', 'salut'), '<br />'; // retourne 'hey, les gars !'
echo strDiff ('salut les gars', 'salut'), '<br />'; // retourne 'les gars'
echo strDiff ('salut', 'salut'), '<br />'; // retourne 1
echo strDiff ('rien à voir', 'salut'), '<br />'; // retourne -1
?>

Ou alors, je n'ai pas pigé le véritable but de ta source ;-)

Commentaire de guill76 le 30/11/2005 01:05:35

ben ouais , comme ça c'est plutôt mieux, mais  j'en avais besoin dans un cas précis quand les 2 chaines débutaient par le premier paramètre et je ne connaissais pas cette utilisation de substr_replace.Donc je m'étais arrêter à ce cas.
C'est vrai que 'chaine différentielle' est peut être une mauvaise dénomination. Enfin bon, voilà la fonction est postée et des fois y'a pire comme code.

Commentaire de malalam le 30/11/2005 08:48:20 administrateur CS

Je n'ai pas dit que le code était pourri ;-)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Comparer des dates [ par Blondy ] Je voudrais comparer des dates pour savoir quel fichier est le plus vieux... Mais lorsque je crée une date avec date("dmy"); par exemple, ça me crée q Comparaison de date [ par benett ] J'essaie de créer un site CDThèque et j'ai un gros problème : J'explique :Comment puis-je faire à partir de deux dates (La date de visite du site et l Taille d'une chaine de caractere [ par g0belin ] Comment savoir la Taille d'une chaine de caractere???Je sais que en delphi il faut faire lenght(nom_de_ma_chaine)merci d'avance Longueur de chaine... [ par ElfeNoir ] Bonjour!En résumé : j'ai créé une page de format pdf, (en php), avec un tableau qui est renseigné par une bdd, le problème que je rencontre est de ca extrairees lettres ou numeros d\\'une chaine [ par apz ] sltm, j'ai la chaine de caractere suivante : $str="m13_19" je voulais recuperer seulement les lettres de cette chaine en utilisant SETTYPE : $lett=set extrairees lettres ou numeros d'une chaine [ par apz ] sltm, j'ai la chaine de caractere suivante : $str="m13_19" je voulais recuperer seulement les lettres de cette chaine en utilisant SETTYPE : $lett=set comparer une date saisie avec une date mysql [ par cLilie ] Salut,je cherche comment comparer une date saisie au clavier dans une zone de texte et une date provenant de mysql.et aussi j'aimerais pouvoir ajouter chaine 2 caract [ par saad123 ] salut!!!kelkun pourré me dire comment couper une chaine de caractère avec certains critèreexemple : g une variable avec dedans http://www.ouah.com et couper une chaine de car [ par saad123 ] salut!!!kelkun pourré me dire comment couper une chaine de caractère avec certains critèreexemple : g une variable avec dedans http://www.ouah.com et Recherche d'une chaine de caractère dans un fichiers et affichage du paragraphe contenant la chaine? [ par dolu007 ] j'ai besoin de programmer un logiciel qui va me permettre de rechercher un mot ou une chaine de caractèredans un fichier lui meme contenu dans un répe


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,655 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales