[RESOLU] string avec virgules et parenthèse en array

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] string avec virgules et parenthèse en array

Re: [RESOLU] string avec virgules et parenthèse en array

par deraphypers » 10 juil. 2019, 19:37

Merci beaucoup. J'essayais ce code pendant plusieurs heures.

Re: [RESOLU] string avec virgules et parenthèse en array

par Saian » 14 juin 2019, 11:26

Je t'ai commenté tout le code et j'ai ajouté une gestion d'erreur si la chaine est mal formatée pour le json_decode. Ainsi y a moyen de déboguer la fonction pour la corriger.
// input string : (a,b,(c,d),((e,f),g),h)
// json string  : ["a","b",["c","d"],[["e","f"],"g"],"h"]

function stringToArray($string) {
  /** escape some chars */
  /* escape brackets with :ob: for open bracket and :cb: for close bracket */
  $string = str_replace(array('[', ']'), array(':ob:', ':cb:'), $string);
  /* look for strings like 'string' and escape parentheses with :op: for open parenthesis and :cp: for close parenthesis */
  $string = preg_replace_callback("`'(.*?)'`", function ($matches) {
      return "'".str_replace(array('(', ')'), array(':op:', ':cp:'), $matches[1])."'";
    }, $string);

  /** jsonify string */
  /* replace all strings between , ( ) by "string" */
  $string = preg_replace('`([^,\(\)]+)`', '"$1"', $string);
  /* replace parentheses by brackets */
  $string = str_replace(array('(', ')'), array('[', ']'), $string);

  /* convert json string to php array */
  $array = json_decode($string);

  /* error, bad json string format */
  if (!is_array($array)) {
    echo "Something went wrong, the string <b>$string</b> is not well formatted for json_decode!<br/>";
    exit();
  }

  /* restore escaped characters by their original character and return the array */
  return restoreEscaped($array);
}
function restoreEscaped($array)
{
  /* explore the array recursively and restore the escaped characters when the entry is not an array */
  return array_map(function ($entry) {
    return is_array($entry)
      ? restoreEscaped($entry)
      : str_replace(
          array(':ob:', ':cb:', ':op:', ':cp:'),
          array('[', ']', '(', ')'),
          $entry);
    }, $array);
}

function arrayToString($array)
{
  /* escape the brackets in the array */
  $array = escapeBrackets($array);
  /* convert php array to json string */
  $string = json_encode($array);
  /* replace brackets, double quotes and escaped brackets to match input string format */
  $string = str_replace(array('[', ']', '"', ':ob:', ':cb:'), array('(', ')', '', '[', ']'), $string);

  return $string;
}
function escapeBrackets($array) {
  /* explore the array recursively and escape the brackets when entry is not an array */
  return array_map(function ($entry) {
    return is_array($entry)
      ? escapeBrackets($entry)
      : str_replace(
          array('[', ']'),
          array(':ob:', ':cb:'),
          $entry);
  }, $array);
}

Re: string avec virgules et parenthèse en array

par Saian » 14 juin 2019, 11:03

Si ça te dit ça c'est que $string est mal formatée pour le json_decode et qu'il n'en ressort donc pas un tableau... c'est quoi ta chaine d'entrée ?
Effectivement ça filtre mais du coup y a rien qui ressort de la fonction stringToArray.

Re: string avec virgules et parenthèse en array

par leiopar » 14 juin 2019, 11:02

J'ai rajouté un truc qui semble filter :

Code : Tout sélectionner

function restoreEscaped($array){ //https://forum.phpfrance.com/post460425.html if(is_array($array)) return array_map(function ($entry) { return is_array($entry) ? restoreEscaped($entry) : str_replace( array(':ob:', ':cb:', ':op:', ':cp:'), array('[', ']', '(', ')'), $entry); }, $array); }

Re: string avec virgules et parenthèse en array

par leiopar » 14 juin 2019, 10:59

Ca à l'air de fonctioner mais j'ai des message malpolis :

Code : Tout sélectionner

Warning: array_map(): Argument #2 should be an array in B:\WWW\ifc_position\res\fonctions.php on line 34
Ca vise l'avant dernière ligne de la fonction "restoreEscaped" :

Code : Tout sélectionner

26|function restoreEscaped($array){ | ... 34| }, $array); 35|}

Re: [RESOLU] string avec virgules et parenthèse en array

par leiopar » 14 juin 2019, 10:38

Bon ... ben j'ai plus qu'à comprendre tout ça (et doubler la poids du code avec des commentaires que je puisse encore comprendre dans 6 mois O:) )
Encore merci. :wink:

Re: string avec virgules et parenthèse en array

par Saian » 13 juin 2019, 17:05

Le faire avec une ou deux expressions régulières me paraissait trop compliqué. C'est pour ça que j'ai plutôt fait une expression régulière simple pour récupérer toutes les chaînes entre apostrophes et y appliquer une fonction de rappel avec preg_match_callback pour pouvoir remplacer les parenthèses avec un simple str_replace. Mon parti pris a été de remplacer les caractères gênants par des chaînes arbitraires (mais signifiantes) qui à priori ne devraient pas être présentes dans la chaîne originale, puis de restaurer ces chaînes de remplacement par leur caractère original à la fin du traitement.

Je t'ai mis le stringToArray et le arrayToString. ;)

Re: string avec virgules et parenthèse en array

par leiopar » 13 juin 2019, 16:44

J'était en train de me battre avec ça :

Code : Tout sélectionner

function param2tab($ifcParam){ // mise en tableau des parametres $ifcParam=preg_replace("#('.*)\((.*')#","$1&#40;$3",$ifcParam); $ifcParam=preg_replace("#('.*)\)(.*')#","#$1&#41;$3#",$ifcParam); $string = str_replace(array('(', ')'), array('[', ']'), $ifcParam); $string = preg_replace('`([^,\[\]]+)`', '"$1"', $string); return json_decode($string); }
J'étais loin du compte !
(j’analyse tout ça demain)
encore merci.

Re: string avec virgules et parenthèse en array

par Saian » 13 juin 2019, 15:55

Forcément ça complique un peu les choses... avec ça, ça supportera également les crochets ^^
function stringToArray($string) {
  /* escape some chars */
  $string = str_replace(array('[', ']'), array(':ob:', ':cb:'), $string);
  $string = preg_replace_callback("`'(.*?)'`", function ($matches) {
      return "'".str_replace(array('(', ')'), array(':op:', ':cp:'), $matches[1])."'";
    }, $string);
  
  /* jsonify string */
  $string = preg_replace('`([^,\(\)]+)`', '"$1"', $string);
  $string = str_replace(array('(', ')'), array('[', ']'), $string);

  $array = json_decode($string);
  return restoreEscaped($array);
}
function restoreEscaped($array)
{
  return array_map(function ($entry) {
    return is_array($entry)
      ? restoreEscaped($entry)
      : str_replace(
          array(':ob:', ':cb:', ':op:', ':cp:'),
          array('[', ']', '(', ')'),
          $entry);
    }, $array);
}

function arrayToString($array)
{
  $array = escapeBrackets($array);
  $string = json_encode($array);
  $string = str_replace(array('[', ']', '"', ':ob:', ':cb:'), array('(', ')', '', '[', ']'), $string);

  return $string;
}
function escapeBrackets($array) {
  return array_map(function ($entry) {
    return is_array($entry)
      ? escapeBrackets($entry)
      : str_replace(
          array('[', ']'),
          array(':ob:', ':cb:'),
          $entry);
  }, $array);
}

Re: [RESOLU] string avec virgules et parenthèse en array

par leiopar » 13 juin 2019, 15:20

Arf ... ya un problème quand un élément chaine de caractère (entre simple cote) contient des parenthèse, genre ça :

Code : Tout sélectionner

(a,'chaine avec (parenthèse) dedans',(c,d),((e,f),g),h)
Comment, par exemple, les remplacer momentanément mais sans remplacer les autres parenthèses qui définissent les ensemble ?

Re: string avec virgules et parenthèse en array

par leiopar » 06 juin 2019, 13:52

Royal !
encore merci ==> RESOLU

Re: string avec virgules et parenthèse en array

par Saian » 06 juin 2019, 12:43

Comme ça : :wink:
function arrayToString($array)
{
  $string = json_encode($array);
  $string = str_replace(array('[', ']', '"'), array('(', ')', ''), $string);

  return $string;
}

Re: [RESOLU] string avec virgules et parenthèse en array

par leiopar » 06 juin 2019, 12:23

Question limite or sujet : comment fait on l'opération inverse ?
(se sent que je vais rapidement avoir besoin de ça)

Re: string avec virgules et parenthèse en array

par leiopar » 06 juin 2019, 10:37

Génial !!!
Merci à toi Saian :-)

Re: string avec virgules et parenthèse en array

par Saian » 06 juin 2019, 10:28

Oui dans ce cas faut adapter l'expression régulière qui n'était faite que pour capturer des mots. En prenant tout sauf virgules et crochets :
$string = "('1xrWb_VEHEZRY9JJ9v3lYY',#41,'Default',$,$,#619,$,$,.ELEMENT.,(44,59,59,999999),(4,59,59,999999),150000.,$,$)";
echo "string = $string<br/>";

function stringToArray($string) {
  $string = str_replace(array('(', ')'), array('[', ']'), $string);
  $string = preg_replace('`([^,\[\]]+)`', '"$1"', $string);

  return json_decode($string);
}

echo '<pre>';
print_r(stringToArray($string));
echo '</pre>';

Sortie :
string = ('1xrWb_VEHEZRY9JJ9v3lYY',#41,'Default',$,$,#619,$,$,.ELEMENT.,(44,59,59,999999),(4,59,59,999999),150000.,$,$)

Array
(
    [0] => '1xrWb_VEHEZRY9JJ9v3lYY'
    [1] => #41
    [2] => 'Default'
    [3] => $
    [4] => $
    [5] => #619
    [6] => $
    [7] => $
    [8] => .ELEMENT.
    [9] => Array
        (
            [0] => 44
            [1] => 59
            [2] => 59
            [3] => 999999
        )

    [10] => Array
        (
            [0] => 4
            [1] => 59
            [2] => 59
            [3] => 999999
        )

    [11] => 150000.
    [12] => $
    [13] => $
)