0
votes

Comment extraire certains mots d'une chaîne php?

J'ai une longue chaîne comme celle-ci I1: 1; I2: 2; I8: 2; NA1: 5; IA1: [1,2,3,4,5]; S1: asadada; SA1: [ 1, 2, 3, 4, 5]; SA1: [1, 2, 3, 4, 5]; . Maintenant, je veux juste obtenir certains mots comme 'I1', 'I2', 'I8', 'NA1' et ainsi de suite, c'est-à-dire des mots entre ':' & ';' uniquement, et stockez-les dans un tableau. Comment faire cela efficacement?

J'ai déjà essayé d'utiliser preg_split () et cela fonctionne mais me donne une mauvaise sortie. Comme indiqué ci-dessous.

Array
(
    [0] => I8
    [1] => 2
    [2] => I1
    [3] => 1
    [4] => I2
    [5] => 2
    [6] => I3
    [7] => 2
    [8] => I4
    [9] => 4
    [10] => 
)
Array
(
    [0] => NA1
    [1] => 5
    [2] => 
)
Array
(
    [0] => IA1
    [1] => [1,2,3,4,5]
    [2] => 
)
Array
(
    [0] => S1
    [1] => asadada
    [2] => 
)
Array
(
    [0] => SA1
    [1] => [1,2,3,4,5]
    [2] => 
)

Le résultat que j'obtiens est celui-ci

// $a is the string I want to extract words from
$str = preg_split("/[;:]/", $a);
print_r($str);

Mais j'attends "I8", " I1 ',' I2 ',' I3 ',' I4 'également dans un tableau séparé avec la position [0]. Toute aide sur la façon de procéder.


0 commentaires

3 Réponses :


0
votes

Une approche possible consiste à utiliser une combinaison de explode () et implode () . Le résultat est renvoyé sous forme de chaîne, mais vous pouvez facilement le mettre dans un tableau par exemple.

I1,I2,I8,NA1,IA1,S1,SA1,SA1,.

Sortie:

<?php
$input = "I1:1;I2:2;I8:2;NA1:5;IA1:[1,2,3,4,5];S1:asadada;SA1:[1,2,3,4,5];SA1:[1,2,3,4,5];.";
$output = array();

$array = explode(";", $input);
foreach($array as $item) {
   $output[] = explode(":", $item)[0];
}    

echo implode(",", $output);
?>


0 commentaires

0
votes

Vous pouvez essayer quelque chose comme.

<?php

$str = 'I1:1;I2:2;I8:2;NA1:5;IA1:[1,2,3,4,5];S1:asadada;SA1:[1,2,3,4,5];SA1:[1,2,3,4,5];';

preg_match_all('/(?:^|[;:])(\w+)/', $str, $result);

print_r($result[1]);  // Matches are here in $result[1]


0 commentaires

0
votes

Vous pouvez effectuer une correspondance gourmande pour faire correspondre les éléments entre ; et : en utilisant preg_match_all ()

<?php

$str = 'I1:1;I2:2;I8:2;NA1:5;IA1:[1,2,3,4,5];S1:asadada;SA1:[1,2,3,4,5];SA1:[1,2,3,4,5];';

preg_match_all('/;(.+?)\:/',$str,$matches);

print_r($matches[1]);

Démo en direct: https://3v4l.org/eBsod


0 commentaires