$a = "Je suis un chat et je n'aime pas les chiens !"
$b = "Je suis un chient et je n'aime pas les chats !"
J'aimerais par exemple qu'une fonction miracle compare ses deux variables et me retourne 1 s'il détecte un point commun de plus de x caractères (disons 10), ici il y aurait deux point commun par exemple, "Je suis un " et " et je n'aime pas les ".
Quelqu'un ne connaitrait pas par hasard un UDF proposant cette fameuse fonction miracle ?
Modifié en dernier par lacnia le lun. 28 juil. 2014 14:31, modifié 1 fois.
Voir peut-être de ce côté-là à appliquer récursivement. Je ne citerai aucun nom de peur de voir mikell ramener sa fraise pour m'infliger des supplices inavouables
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
$a = "Je suis un chat et je n'aime pas les chiens !"
$b = "Je suis un chient et je n'aime pas les chats !"
$x = 10
$res = ""
For $i = 1 to StringLen($a)-$x
$str = StringMid($a, $i, $x)
If StringInStr($b, $str) Then $res &= $str & @crlf
Next
Msgbox(0,"", $res)
Maintenant si tu veux plus de précisions dans la chaîne de plus de x caractères (par exemple qu'elle ne contienne que des mots entiers) il faut affiner
$a = "Je suis un chat et je n'aime pas les chiens !"
$b = "Je suis un chien et je n'aime pas les chats !"
_Compare($a, $b, 10)
Func _Compare($str1, $str2, $x)
Local $test, $tmp = "", $res = ""
For $i = 0 to StringLen($str1)-$x
$test = StringRegExp($str1, '^.{' & $i & '}\s*\b([^''].{'& $x-1 & '}\S*)', 3)
If IsArray($test) and $test[0] <> $tmp Then
If StringRegExp($str2, '\b\Q' & $test[0] & '\E\b') Then $res &= $test[0] & @crlf
$tmp = $test[0]
EndIf
Next
If $res <> "" Then Return Msgbox(0,"", $res)
Return 0
EndFunc
Ces codes sont très faciles à adapter pour retourner un booléen
" L'échec est le fondement de la réussite. " (Lao-Tseu ) " Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Local $a = "Alors voici la vérité : je suis un chat et je n'aime pas les chiens, mais alors pas du tout du tout !"
Local $b = "Je suis un chien et je n'aime pas du tout les chats, voilà la vérité !"
Local $x = 10
Local $min = $a, $max = $b, $swapped = False
If StringLen($a) > StringLen($b) Then
$min = $b
$max = $a
$swapped = True
EndIf
_ConsoleWrite("Chaîne 1 : <" & $min & ">" & @LF)
_ConsoleWrite("Chaîne 2 : <" & $max & ">" & @LF & @LF)
;~ Local $res[0][3] ; peut recevoir les résultats
Local $pos[3]
Local $sub, $j, $iPosInMax, $match
For $i = 1 to StringLen($min) - $x
$sub = StringMid($min, $i, $x)
$iPosInMax = StringInStr($max, $sub)
If $iPosInMax Then
; on a trouvé une correspondance de longueur $x
; cherchons la correspondance maximum
$j = 0
While StringInStr($max, StringMid($min, $i, $x + $j + 1), Default, 1, $iPosInMax)
$j += 1
WEnd
$match = StringMid($min, $i, $x + $j)
_ConsoleWrite('La chaîne "' & $match & _
'" figure en position ' & StringInStr($min, $match) & ' de la chaîne ' & ($swapped ? 1 : 2) & _
' et en position ' & StringInStr($max, $match) & ' de la chaîne ' & ($swapped ? 2 : 1) & @LF)
$i += $j
EndIf
Next
;~ _ArrayDisplay($res)
Func _ConsoleWrite($s)
ConsoleWrite(BinaryToString(StringToBinary($s, 4), 1))
EndFunc
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.