Jump to content
Sign in to follow this  
Compte supprimé

Comparer 2 chaines de caractères

Rate this topic

Recommended Posts

Ben c'est bizarre, il me dit "file not found" :hypocrite:

<{POST_SNAPBACK}>

OK, c'est bon j'abandonne... En fait, l'url est comme la précedente...

Voilà

Share this post


Link to post
Share on other sites

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 ? ;)

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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 ?

Share this post


Link to post
Share on other 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" ;) ...

Share this post


Link to post
Share on other 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:

Share this post


Link to post
Share on other 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...

Share this post


Link to post
Share on other 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>';
}
}


?>

Edited by e.MiLoU

Share this post


Link to post
Share on other sites

A part les correction en bloc, ça commence vraiment à avoir de la gueule !

J'ai toutefois relevé 2 problèmes :

- mauvaise gestion des '

- problème avec les caractères type . et , qu'il affiche avec un espace avant.

Sinon top !

Share this post


Link to post
Share on other 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.

Edited by TheRec

Share this post


Link to post
Share on other sites

Es-tu sûr qu'ils sont toujours d'actualité??

Bravo en tous cas !

Je sers la science et c'est ma joie!

Edited by e.MiLoU

Share this post


Link to post
Share on other 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 "," ...

Share this post


Link to post
Share on other 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...

Edited by TheRec

Share this post


Link to post
Share on other 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??

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other 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 ?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...