StringSplitEx

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
mdanielm
Membre émérite
Membre émérite
Messages : 206
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

StringSplitEx

#1

Message par mdanielm » dim. 22 juil. 2018 06:31

Bonjour à tous,

La fonction StringSplit(), bien que très utile en l'état, présente deux inconvénients:

1-Lorsque elle est utilisée avec l'option $STR_CHRSPLIT, elle ne retourne pas les caractères
qui ont provoqué les coupures, par exemple:
StringSplit("a+b*c", "+-*/")
retourne le tableau [3,a,b,c] mais ne retourne pas le caractère entre a et b, ou entre b et c.

2-Avec l'option $STR_ENTIRESPLIT elle coupe la chaine initiale chaque fois qu'elle détecte une chaîne
donnée mais pas un modèle de chaîne (regexp). Par exemple, pour splitter une chaîne html au niveau de
chaque balise, on ne peut pas utiliser StringSplit. Ce serait pourtant utile pour effectuer un
traitement sur le texte brut, par exemple une traduction En->Fr, avec l'objectif de recoller les
morceaux après.

Je propose donc qu'on améliore StringSplit en:

StringSplitEx($sString, $sRegex, $bWithMatch = False)


Si $bWithMatch est à true, le tableau retournée serait:
[0]: nombre d'éléments
[1]: sous-chaîne avant le 1er match ou "" si le 1er match est au début
[2]: 1er match
[3]: sous-chaine qui sépare le 1er match du 2nd, éventuellement "" si deux matchs se suivent
[4]: 2-ième match
[5]: sous-chaine qui sépare le 2nd match du 3-ième, éventuellement "" si deux matchs se suivent
[6]: 3-ième match
etc....

Après traitement des éléments IMPAIRS du tableaux $arr, on recollerait les morceaux avec:
$ret = ""
for $i = 1 to $arr[0]
    $ret &= $arr[$i]
Next

Toi, qui t'ennuies à mourir à la plage, sous un soleil de plomb, je ne veux surtout pas
te priver du plaisir de programmer en te donnant la solution!

Bonnes vacances.
Modifié en dernier par mdanielm le dim. 22 juil. 2018 15:09, modifié 2 fois.

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5757
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: StringSplitEx

#2

Message par mikell » dim. 22 juil. 2018 09:11

Même en cherchant bien, je ne distingue dans ce post (pour l'instant) point de code fourni qui justifierait sa présence dans le forum "Fonctions et UDF" :wink:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 1993
Enregistré le : lun. 30 mars 2009 21:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: StringSplitEx

#3

Message par jchd » dim. 22 juil. 2018 11:38

Cela ne serait pas le #3645 du Trac US ?
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5757
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: StringSplitEx

#4

Message par mikell » dim. 22 juil. 2018 18:29

Ah oui en effet, ya comme un air de famille :mrgreen:

Par contre en prenant le problème en amont, les exemples utilisés (avec les "||" ) évoquent furieusement le résultat d'une erreur de paramètres avec _ArrayToString

Dans l'exemple du post #1 avec les balises html, pour éviter du regex trop complexe qui augmente fatalement le risque d'erreur, personnellement j'aime bien faire comme ça

#Include <Array.au3>

$a = FileRead("a.htm")
$array = StringSplitEx($a, "<.*?>")
; _ArrayDisplay($array)

$array[26] =  "Function Test"

$b = _ArrayToString($array, "")
Filewrite("essai.htm", $b)
ShellExecute("essai.htm")

Func StringSplitEx($string, $regex)
    Local $subst = ChrW(0xfffd)
    $c = StringRegExpReplace($string, '(?s)(' & $regex & ')', $subst & "$1" & $subst)
    $res = StringSplit($c, $subst, 3)
    Return $res
EndFunc
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

Avatar du membre
mdanielm
Membre émérite
Membre émérite
Messages : 206
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: StringSplitEx

#5

Message par mdanielm » lun. 23 juil. 2018 07:39

Merci de préciser le lien pour accéder au Trac US que je ne fréquente pas!

... OK, je n'avais pas vu que le lien a été ajouté entre temps par jchd.
C'est vrai, les fonctions sont semblables, je ne donnerai donc pas le code!

jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 1993
Enregistré le : lun. 30 mars 2009 21:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: StringSplitEx

#6

Message par jchd » lun. 23 juil. 2018 10:49

Pour tout avouer je n'ai rien modifié, ça a dû être un effet de magie blanche ou de ma bonne étoile.

Par ailleurs, j'ai appris à mes dépens à me méfier de l'utilisation de regex pour aller pêcher dans du html. Certains gros sites sont parfaitement capables de renvoyer des contenus html équivalents mais distincts pour deux reqêtes identiques faites à quelques secondes d'intervalle depuis la même machine, voire simplement en refraîchissant la page immédiatement. Je n'ai plus d'exemples en tête mais j'ai trouvé parfois des espacements différents, ce qui impose d'avoir des \s* à peu près partout dans des regex traitant du html. Ca veut dire que des mêmes requêtes faites en séquence rapide peuvent être traitées par des serveurs d'une ferme disposant de morceaux de code distincts syntactiquement mais foctionnellement équivalents.

Ca fait des années que je n'ai quasiment plus besoin de code AutoIt pour mon activité mais si jamais je dois à nouveau taper dans du html, ça sera avec les fonctions DOM qui font ça très bien dans tous les cas.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.

Avatar du membre
mdanielm
Membre émérite
Membre émérite
Messages : 206
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: StringSplitEx

#7

Message par mdanielm » lun. 23 juil. 2018 13:01

Quand j'ai créé StringSplitEx, en 2014, mon souci était la traduction des pages htm de la documentation AutoIt, ...qui se trouvaient sur mon disque!

jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 1993
Enregistré le : lun. 30 mars 2009 21:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: StringSplitEx

#8

Message par jchd » lun. 23 juil. 2018 13:11

Je disais juste ça au passage pour potentiellement éviter à un futur lecteur de se faire mordre.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.

Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11312
Enregistré le : ven. 20 juil. 2007 20:00
Localisation : Bordeaux
Status : Hors ligne

Re: StringSplitEx

#9

Message par Tlem » lun. 23 juil. 2018 18:57

jchd a écrit :
lun. 23 juil. 2018 10:49
Pour tout avouer je n'ai rien modifié, ça a dû être un effet de magie blanche ou de ma bonne étoile.
On ne m'avais jamais traiter de "bonne étoile". ^^
Mais il faut un début à tout. :D
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 1993
Enregistré le : lun. 30 mars 2009 21:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: StringSplitEx

#10

Message par jchd » mar. 24 juil. 2018 01:44

Ou bien tu es un magicien blanc de ton propre forum, formule polie pour désigner un travailleur de l'ombre.

Une bonne étoile ? Ne prends pas trop la confiance quand même :lol:
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.

Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11312
Enregistré le : ven. 20 juil. 2007 20:00
Localisation : Bordeaux
Status : Hors ligne

Re: StringSplitEx

#11

Message par Tlem » mar. 24 juil. 2018 06:54

Oui, tu as raison, soyons pragmatique et considérons que cela était le travail du modérateur que je suis. ^^

Envoyé de mon téléphone en utilisant Tapatalk


Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

Répondre