2
votes

Comment puis-je diviser une chaîne en un tableau?

J'essaye de diviser ma chaîne en un tableau. Toutes les chaînes entre les signes de calcul +/*-:

Array
(
    [0] => quantity
    [1] => price
    [1] => tax
)

Voici ce que j'essaye de réaliser:

$keywords = preg_split("/[\s,-]*[+-*]+/", "quanity*price/2+tax");

Mais le résultat est une chaîne vide.


9 commentaires

Voulez-vous dire diviser sur [- * \ / + \ d] + regex101. com / r / 3NEEfc / 1 Vous pouvez déplacer le - au début / à la fin de la classe de caractères ou l'échapper \ -


oh, c'est le site Web dont j'ai vraiment besoin. Merci


Non, mais le quatrième oiseau l'offrait sans demander


pourquoi ne pas exploser + str_replace ici ??


@Thefourthbird J'ai testé votre code. ça marche, mais pas, si j'essaye cette ligne "quanity * price / 2". Ensuite, j'obtiens une valeur vide dans mon tableau


@devpro j'ai lu dans un tutoriel qui explose ne fonctionne pas avec plusieurs caractères + / * -


@peace_love C'est à cause de la scission. Il y a une correspondance mais rien sur la droite donc elle sera vide. Quel est le résultat / comportement attendu?


Voici la sortie: array: 3 [▼ 0 => "quanity" 1 => "price" 2 => ""] Ceci est attendu: array: 3 [▼ 0 => "quanity" 1 => "prix"]


@peace_love Vous pouvez le faire comme ceci 3v4l.org/dmdHP


3 Réponses :


3
votes

Cela divisera la chaîne là où l'un d'entre eux existe: + / * et en créera un tableau:

$string = "quanity*price/2+tax";  
$str_arr = preg_split ("/[-*\/+\d]+/", $string);  
print_r($str_arr); 

Code publié avec votre exemple pour plus de clarté.

p>


0 commentaires

2
votes

Utilisation de l'expression régulière recommandée par le quatrième oiseau:

$keywords = preg_split("/[-*\/+\d]+/", "quanity*price/2+tax", -1, PREG_SPLIT_NO_EMPTY);

Le PREG_SPLIT_NO_EMPTY doit supprimer les valeurs vides ( https://www.php.net//manual/en/function.preg-split.php ).


2 commentaires

Le résultat de votre réponse: array: 1 [▼ 0 => "quanity * price / 2 + tax"]


Excellente prise, @peace_love. J'avais manqué le troisième paramètre facultatif dans preg_split et j'avais égaré le drapeau. J'ai mis à jour ma réponse pour inclure -1 pour le paramètre $ limit, pour ne spécifier aucune limite. J'aurais pu aussi passer 0 ou null .



3
votes

Dans le modèle que vous avez essayé, la deuxième classe de caractères ne correspond pas à un chiffre et le tiret doit être échappé ou placé au début / à la fin.

Vous pouvez utiliser une seule classe de caractères à la place. Si vous remplacez le délimiteur par un autre que / comme ~ , vous n’avez pas besoin d’échapper la barre oblique.

[\s,]*[-*/+\d]+

Démo Regex | Démo Php

Par exemple

Array
(
    [0] => quanity
    [1] => price
    [2] => tax
)
Array
(
    [0] => quanity
    [1] => price
)

Sortie

$strings = [
    "quanity*price/2+tax",
    "quanity*price/2"
];

foreach ($strings as $string) {
    $keywords = preg_split("~[-*/+\d]+~", $string,  -1, PREG_SPLIT_NO_EMPTY);
    print_r($keywords);
}

Si vous voulez également faire correspondre 0+ caractères d'espacement précédents, virgules:

[-*\/+\d]+

Démo Regex


0 commentaires