2017-03-23 2 views
0

Ma chaîne ressemble ci-dessous:Comment capturer toutes les sous-chaînes numériques de la chaîne?

Response: 311768560 
311768562 
311768564 

J'ai essayé:

$success_pattern="Response: ((\d+)[\n])*"; 
$response="Response: 311768560\n311768562\n311768564\n311768566"; 
preg_match("/$success_pattern/i", $response, $match); 

Sortie:

Array ( 
    [0] => Response: 311768560 311768562 311768564 
    [1] => 311768564 
    [2] => 311768564 
) 

je besoin d'un tableau contenant tous les nombres en sortie comme:

array('311768560','311768562','311768564'); 
+0

comme vous voulez seulement par preg_match alors faites le moi savoir, est-il fixé qu'il y aura 3 numéros? –

Répondre

0
<?php 

$string="Response: 311768560 311768562 311768564"; 
preg_match_all("/[\d]+/", $string, $matches); 
print_r($matches); 

Sortie:

Array 
(
    [0] => Array 
     (
      [0] => 311768560 
      [1] => 311768562 
      [2] => 311768564 
     ) 

) 
+0

Merci beaucoup pour votre réponse, mais je ne veux utiliser que preg_match pas preg_match_all – mateors

+0

@mateors Pour trouver plusieurs correspondances, vous devez aller pour 'preg_match_all' –

+0

je me réfère à ce site https://regex101.com/ ils ont dit A répété Le groupe de capture ne capture que la dernière itération. Placer un groupe de capture autour du groupe répété pour capturer toutes les itérations ou utiliser un groupe non-capturant à la place si les données ne vous intéressent pas, donc je suppose qu'il devrait y avoir une solution, êtes-vous sûr que preg_match_all est la seule solution? Merci d'avance pour votre aide. – mateors

-1

Utilisez la fonction array_shift()

<?php 
$str = "Response: 311768560 311768562 311768564"; 
$s = explode(" ",$str); 
$p = array_shift($s); 
print_r($s); 
?> 

de sortie

Array (
    [0] => 311768560 
    [1] => 311768562 
    [2] => 311768564) 
+0

Merci, mais j'ai seulement besoin d'utiliser preg_match – mateors

+0

Vous avez modifié l'entrée en fonction de votre méthode. '$ str' ne représente pas précisément l'entrée d'échantillon de l'OP. – mickmackusa

0

Essayez de ne pas trop accroché sur une fonction spécifique comme preg_match(). PHP propose plusieurs façons de générer votre sortie souhaitée. Je vais vous montrer trois approches différentes:

entrée:

$response="Response: 311768560 
311768562 
311768564"; 

Méthode n ° 1: explode() avec substr() et strpos() (Demo)

$array=explode("\r\n",substr($response,strpos($response,' ')+1)); 

* Note, cette méthode suppose que la première chaîne (Response) est la seule sous-chaîne indésirable et qu'elle est toujours s d'abord. En outre, le \r peut ne pas être nécessaire en fonction de votre environnement de codage. C'est probablement le plus rapide de ma liste de méthodes car il n'utilise pas regex, mais il nécessite 3 appels de fonction et une incrémentation - sans parler du fait qu'il peut être trop littéral pour votre cas d'utilisation réel.

Méthode 2: preg_match_all() (Demo)

$array=preg_match_all('/\d+/',$response,$out)?$out[0]:[]; 

Cette méthode est très directe, rapide et nécessite un minimum de code. S'il y a des inconvénients, preg_match_all() renvoie un résultat true | false et génère une variable de sortie sous la forme d'un tableau multidimensionnel. Pour modifier cette sortie en fonction de votre exigence unidimensionnelle, je place une condition en ligne à la fin de la fonction qui fournit les données souhaitées à $array.

Méthode n ° 3: preg_split() (Demo)

$array=preg_split('/[^\d]+/',$response,null,PREG_SPLIT_NO_EMPTY); 

Cette fonction se comporte comme explode() sauf qu'il brandit la puissance de regex. Le motif identifie toutes les sous-chaînes non numériques et les utilise comme "délimiteurs" et sépare la chaîne sur chacune d'elles.Pour votre saisie, le premier délimiteur est "Réponse:", puis le ou les caractères de nouvelle ligne après: "311768560" et "311768562". La beauté de preg_split() est qu'il fournit directement le tableau à une dimension que vous recherchez.

Sortie:

Peu importe laquelle des méthodes ci-dessus vous essayez, vous recevrez la même sortie correcte: $array=array('311768560','311768562','311768564');

Si l'une de ces méthodes échouent votre cas réel d'utilisation, il est probablement le produit de votre chaîne $response étant trop différent des exemples de données que vous avez publiés ici.