Page 1 sur 1

StringSplitEx

Posté : dim. 22 juil. 2018 07:31
par mdanielm
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.

Re: StringSplitEx

Posté : dim. 22 juil. 2018 10:11
par mikell
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:

Re: StringSplitEx

Posté : dim. 22 juil. 2018 12:38
par jchd
Cela ne serait pas le #3645 du Trac US ?

Re: StringSplitEx

Posté : dim. 22 juil. 2018 19:29
par mikell
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

Re: StringSplitEx

Posté : lun. 23 juil. 2018 08:39
par mdanielm
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!

Re: StringSplitEx

Posté : lun. 23 juil. 2018 11:49
par jchd
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.

Re: StringSplitEx

Posté : lun. 23 juil. 2018 14:01
par mdanielm
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!

Re: StringSplitEx

Posté : lun. 23 juil. 2018 14:11
par jchd
Je disais juste ça au passage pour potentiellement éviter à un futur lecteur de se faire mordre.

Re: StringSplitEx

Posté : lun. 23 juil. 2018 19:57
par Tlem
jchd a écrit : lun. 23 juil. 2018 11: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

Re: StringSplitEx

Posté : mar. 24 juil. 2018 02:44
par jchd
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:

Re: StringSplitEx

Posté : mar. 24 juil. 2018 07:54
par Tlem
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