Aller au contenu

Comparer 2 chaines de caractères


Compte supprimé

Sujets conseillés

Tu abandonnes quoi ? La résolution de ce problème de espaces "significatifs" et "non-significatifs" ? Ou essayer de nous faire accéder à ton serveur personnel par ton adresse de loopback ? ;)

Lien vers le commentaire
Partager sur d’autres sites

Essayer de vous faire accéder au serveur.

Concernant la correction du petit chat noir en grande folle rose, je crois que ça va aller, mais je dois encore changer pas mal de chose, je fais ça demain, vous l'aurez dans la soirée normalement.

Lien vers le commentaire
Partager sur d’autres sites

Re,

Sans vouloir jouer les rabats joie, il semblerait que le bas de page "Designed and CoDeD by MiLoU " soit décallé vers le bas. On ne voit pas le bas des mots, qui est 'coupé' par le tableau.

Pour l'histoire de la ponctuation, il faudrait savoir ce que l'on veut enlever, comme ponctuation. Les points, par exemple. quoi d'autre ?

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

J'ai juste de la peine à comprendre ce qui motive un changement dans ce script concernant la ponctuation, vu que il existe une différence entre la chaîne de base et la chaîne "modifée" il faut qu'elle soit notifiée. Sinon on doit spécifier des erreur qui ne doivent pas être notifiées...

Dans ce cas ça devient perillieux, cela implique (comme je l'ai dit précédemment) de différencier des erreurs significatives et non-significatives mais dans ce cas le script va vite devenir ingérable (trop d'exceptions, différences entre les langues, la signification de certaines poncutations ou des espaces varie selon le contexte). Si c'est pour cela désolé je ne pourrais pas vous aider... mais peut-être que je me trompe et que c'est facile comme "Bonjour" ;) ...

Lien vers le commentaire
Partager sur d’autres sites

le script donne par exemple

le petit chat. chat blanc.

alors qu'il faudrait

le petit chat blanc.

les caractères spéciaux à traiter seraient les simples (pas d'espace avant) comme le point et la virgule, mais aussi les parentèses, ...

y'a du job.

Et si le hub ouvrait un concours ?

Celui qui fait un script qui marche et qui consomme le le moins de ressources ?

C'est pas une bonne idée ça ? :blush:

Lien vers le commentaire
Partager sur d’autres sites

À moins de connaitre l'entier de la phrase et de comparer chaque mot avec l'entier à chaque fois...et de se fixer une limite de distance entre chaque occurence de mots il n'y a pas de de possibilité de changer cela...imaginez simplement que le mot peut se retouver plus loin dans la phrase modifiée et n'avoir aucun rapport avec l'occurence précédente... et en plus, je le répète, cela changerait en fonction de chaque langue...

Lien vers le commentaire
Partager sur d’autres sites

Bon, dans tous les cas, je propose ma nouvelle version.

Elle ne prend toujours pas en compte les grandes partie de texte à modifier, dites moi ce que vous en pensez

Page de test


<?

function EspacePonctu($str)
{
$recherche = array('#!#', '#,#', '#?#', '#\.#', '#;#');
$remplacement = array(' !', ' ,', ' ?',' .', ';');
$str = preg_replace ($recherche, $remplacement, $str);
return $str;
}

function DeEspacePonctu($str)
{
$recherche = array('# !#', '# ,#', '# ?#', '# \.#', '#;#');
$remplacement = array('!', ',', '?','.', ';');
$str = preg_replace ($recherche, $remplacement, $str);
return $str;
}

// Cette fonction permet d'extraire un élément d'indice $index dans un tableau $tab
function ArrayExtract($tab, $index)
{
$u = 0;
$end [0] = '';
foreach($tab as $i => $val)
{
if ($i != $index) $end[$u++] = $val;
}
return $end;
}

/**************************************************************************\
| Cette fonction sert à comparer deux chaines de caractères. |
| Elle a été réalisée par MiLoU pour le topic d'url |
| [url="http://www.webmaster-hub.com/index.php?showtopic=16115"]http://www.webmaster-hub.com/index.php?showtopic=16115[/url] |
| sur le forum Webmaster-Hub |
\**************************************************************************/

// Paramètres
// $t_init: text initial (!! sans htmlentities ou nl2br!!)
// $t_corr: text correctif (!! sans htmlentities ou nl2br!!)
// $distance: distance jusque laquelle le programme va cherche le mot correspondant.

function Corriger($t_init, $t_corr, $distance)
{
// On regarde que les deux chaînes ne sont pas bêtement les mêmes, sans quoi, ça sert à rien de corriger.
if ($t_init == $t_corr)
echo '<p>Les deux chaînes sont identiques.</p>';
else
{
// On remplace les retoursà la ligne par des $$
$t_init = str_replace("\n"," $$ ",$t_init);
$t_corr = str_replace("\n"," $$ ",$t_corr);

// On fait attention aux signes de ponctuations
$t_init = EspacePonctu($t_init);
$t_corr = EspacePonctu($t_corr);

// On stocke chaque mot de la première chaîne dant un tableau
// $t_init = wordwrap($t_init, 1, '#', 0);
$t_init = explode(' ', $t_init);
array_push($t_init, "##");

// On stocke chaque mot de la deuxième chaine dans un tableau
// $t_corr = wordwrap($t_corr, 1, '#', 0);
$t_corr = explode(' ', $t_corr);
array_push($t_corr, "##");

// On regarde quelle est la chaîne la plus longue
$c_init = count($t_init);
$c_corr = count($t_corr);
if ($c_init > $c_corr)
$c_small = $c_corr;
else
$c_small = $c_init;

// On initialise le text final
$t_final[0] = '';
$t = 0;
$i = 0;


// On commence la boucle qui va tout tuer
do
{
/*echo '<h3>Comparaison</h3>';
echo 'A Comparer: '.$t_init[$i] .' - '. $t_corr[$i];*/
if($t_init[$i] == $t_corr[$i]) // C'est les mêmes mots, rien à faire
{
$t_final[$t] = $t_init[$i];
$t_init = ArrayExtract($t_init, $i);
$t_corr = ArrayExtract($t_corr, $i);
}
else
{
// Bon, on va chercher où est la correspondance...
$index_correspondance = '';

$vi = $i;
while($index_correspondance == '')
{

// On regarde si c'est pas t_corr qui a des mots en trop
$v = $vi; // $v comme verif;)

while ($v <= $distance && $v < count($t_corr))
{
// On regarde si ça correspond.
//echo '<p>'.$t_corr[$v] .' - '. $t_init[$vi].'</p>';
if ($t_corr[$v] == $t_init[$vi] OR $t_corr[$v] == "##")
{
$index_t_corr = $v;
break 1;
}

$v++;
}

// On regarde si c'est pas t_init qui a des mots en trop
$v = $vi; // Toujours $v comme verif;)

while ($v <= $distance && $v < count($t_init))
{
// On regarde si ça correspond.
//echo '<p>'.$t_init[$v] .' - ' . $t_corr[$vi].'</p>';
if ($t_init[$v] == $t_corr[$vi] OR $t_init[$v] == "##")
{
$index_t_init = $v;
break 2;
}

$v++;
}
$vi++;
}
/*echo '<h4>Initial</h4>';
echo $index_t_init.'<br />';
echo count($t_init).'<br />';
echo '<h4>Correction</h4>';
echo $index_t_corr.'<br />';
echo count($t_corr).'<br />';*/
if (count($t_init) == 1 && $index_t_corr == count($t_corr) -1 )
{
$t_final[$t] = '<span class="correction">'.$t_corr[$i].'</span>';
$t_corr = ArrayExtract($t_corr, $i);
}
elseif (count($t_corr) == 1 && $index_t_init == count($t_init) -1 )
{
$t_final[$t] = '<span class="corrige">'.$t_init[$i].'</span>';
$t_init = ArrayExtract($t_init, $i);
}
elseif ( ($index_t_init == count($t_init) - 1 && $index_t_corr == count($t_corr) - 1 ) // On regarde qu'il nous a pas mené betement à la fin comme un crétin d'ordinateur.
&& ($t_init[$i] != "##" && $t_corr[$i] != "##") // et qu'on est pas réellement à la fin
)
{
//echo '<b>A la fin</b>';
$t_final[$t] = '<span class="corrige">'.$t_init[$i].'</span> <span class="correction">'.$t_corr[$i].'</span>';
$t_init = ArrayExtract($t_init, $i);
$t_corr = ArrayExtract($t_corr, $i);
}
else
{
// Pour éviter qu'il fasse le gland en effaçant tout
if ($index_t_init == count($t_init) - 1)
$index_t_init = $i;
if ($index_t_corr == count($t_corr) - 1)
$index_t_corr = $i;

// On regarde qui est le plus petit, et on fait en conséquence
if ($index_t_corr > $index_t_init)
{
$tab_origine = 't_corr';
$index_origine = $index_t_corr;
$tab_correspondance = 't_init';
$index_correspondance = $index_t_init;
}
else
{
$tab_origine = 't_init';
$index_origine = $index_t_init;
$tab_correspondance = 't_corr';
$index_correspondance = $index_t_corr;
}

/*
Résumons ce que contiennent les variables
-----------------------------------------

$i contient l'index du tableau

$tab_origine contient le tableau où le mot à matcher est présent
$index_origines contient l'index du tableau $tab_origine où le mot à matché est

$tab_correspondance contient le tableau où le matching mot est présent
$index_correspondance contient l'index du tableau $tab_correspondance où le matching word est présent

Donc:

Si on barre le contenu du tableau $t_init jusqu'au bon index
et
Si on met en rouge le contenu du tableau $t_corr jusqu'au bon index, ça devrait marcher...

Bien entendu, il faudra supprimer le contenu des deux tableaux que l'on a affiché et donc baissé $i de 1

J'ai envie de dire, c'est parti!!
*/


$d_init = $i;
$d_corr = $i;

// On met les bons index où il faut
if ($tab_origine == 't_init')
{
$f_init = $index_origine;
$f_corr = $index_correspondance;
}
else
{
$f_init = $index_correspondance;
$f_corr = $index_origine;
}

// Initialisation de variable
$correction = array_fill(0,$distance,'');

for($c = 0; $c < $f_init - $d_init; $c++)
{
$correction[$c] = $t_init[$d_init];
$t_init = ArrayExtract($t_init, $d_init);
}
$t_final[$t] = '<span class="corrige">'.implode(' ',$correction).'</span>';


// Initialisation de variable
$correction = array_fill(0,$distance,'');



for($c = 0; $c < $f_corr - $d_corr; $c++)
{
$correction[$c] = $t_corr[$d_corr];
$t_corr = ArrayExtract($t_corr, $d_corr);
}

$t_final[$t] .= ' <span class="correction">'.implode(' ',$correction).'</span>';
}

}
/*echo '<br /><b>Initial: </b>';
print_r($t_init);
echo '<br /><b>Correction: </b>';
print_r($t_corr);
echo '<br /><b>Final: </b>';
print_r($t_final);*/

$t++;
} while (count($t_corr) != 1 OR count($t_init) != 1 );

// On affiche les texte final
$t_final = implode(' ',$t_final);
$t_final = str_replace('##','',$t_final);
$t_final = str_replace(" $$ ","\n",$t_final);
$t_final = DeEspacePonctu($t_final);
return '<p>'.$t_final.'</p>';
}
}


?>

Modifié par e.MiLoU
Lien vers le commentaire
Partager sur d’autres sites

Oui je retire ce que j'ai dit dans ce cas... je vais étudier ton code. Bravo en tous cas ! Cela à l'air de marcher très bien, à part le point espaces avant ponctuation cité précédemment par jeroen.

Modifié par TheRec
Lien vers le commentaire
Partager sur d’autres sites

Celui de l'espace avant la virgule, oui.

Essaie :

Une fois de plus

et

Une fois, de plus

La sortie donne un esapce avant la "," ...

Lien vers le commentaire
Partager sur d’autres sites

Et en regardant de plus près ton code... tu fait quelque chose de pas viable à mon avis... tu remplace les caractères qui posent problème par des occurence qui n'en posent pas tant qu'on ne les utilisent pas...

Si je viens a tester par exemple :

Une fois de plus

en le comparant avec :

Une fois de plus!

ou même :

Une fois de plus !

Il me retourne ma phrase d'origine (il passe bien entendu le teste de l'absolue correspondance vu que les chaînes sont différentes)...Avec le script que j'ai proposé il est aussi possible de faire ceci si je me souviens encore du fonctionnement...

Modifié par TheRec
Lien vers le commentaire
Partager sur d’autres sites

Ca devient vraiment nickel. Par contre il gère encore mal les retours chariots. (au niveau des points, et il affiche des $$)

<{POST_SNAPBACK}>

Peux-tu donner les exemples en même temps??

Lien vers le commentaire
Partager sur d’autres sites

  • 4 years later...

Salut tout le monde, je me permet de déterrer ce topic car de toute mes recherches c'est d'après moi le code le plus abouti mais pourtant je n'arrive toujours pas à le faire fonctionner. Mon projet serai de faire une correction de dicté automatisée. Connaissez vous donc un bon moyen de le faire ? Merci.

Lien vers le commentaire
Partager sur d’autres sites

Pour plus d'info j'ai récup le code, j'ai utilisé fopen puis fgets pour ouvrir mes deux fichiers, j'ai fais appel à la fonction corriger et là j'ai ca:

Warning: preg_replace() [function.preg-replace]: Compilation failed: nothing to repeat at offset 0 in C:\wamp\www\import.php on line 19

Warning: preg_replace() [function.preg-replace]: Compilation failed: nothing to repeat at offset 0 in C:\wamp\www\import.php on line 19
Comparaison
A Comparer: -
Initial: Array ( [0] => ## )
Correction: Array ( [0] => ## )
Final: Array ( [0] => )

(à la ligne 19 j'ai la fonction EspacePonctu)

Mets connaissance en php sont limitées donc je pense que c'est tout simplement une erreur de ma part ou une incompréhension qu'en pensé vous ?

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...