2012-07-20 4 views
3

Possible en double:
a simple function for return number from string in phpPHP: Meilleure méthode pour extraire les numéros d'une chaîne

Quelle est la meilleure/méthode la plus efficace pour extraire un ensemble spécifique de nombres d'une chaîne? Par exemple: Je veux obtenir l'ensemble des nombres immédiatement après le numéro de cas dans sring "blah blah cas # 004522 bla bla". J'imagine que le nombre de caractères numériques après le numéro de cas sera toujours le même mais je voudrais que le code ne fasse pas cette supposition comme je l'ai été. Jusqu'à présent, j'ai utilisé une méthode strpos pour localiser le numéro de cas, puis tirer un certain nombre de caractères après les mots en utilisant substr. Je me sens juste comme c'est maladroit. Peut-être que preg_match serait plus efficace ou simplifié?

$text = "blah blah Case#004552 blah blah"; 
$find = strpos($text,'Case#'); 
if ($find) 
    $numbers = substr($text, $find+5, 6); 
+1

'preg_match ('/ \ d +/', $ str, $ match); '-' $ match [0] 'contiendra le premier ensemble continu de chiffres de la chaîne. – DaveRandom

+0

Dépend de votre définition du «meilleur». Voulez-vous dire le plus rapide? Je crois que strpos est censé être le moyen le plus rapide de trouver une chaîne particulière dans une autre chaîne, en supposant que le nombre soit traité comme une chaîne (plus rapide que preg_match). – Rhys

+0

@Ryven: Dans ce cas particulier, le meilleur était avec preg_match car l'obtention de plusieurs correspondances dans un tableau était un bonus inconsidéré. – Brad

Répondre

6

Vous pouvez utiliser des expressions régulières d'abord correspondre à votre modèle de caractères (Case#) et vous attendez pour correspondre à des chiffres (chiffres), qui est \d dans PCRE (Demo):

$numbers = preg_match("/Case#(\d+)/", $text, $matches) 
       ? (int)$matches[1] 
       : NULL 
    ; 
unset($matches); 

pour plusieurs (entier) correspond à la fois:

$numbers = preg_match_all("/Case#(\d+)/", $text, $matches) 
       ? array_map('intval', $matches[1]) 
       : NULL 
    ; 
unset($matches); 
+0

Vous n'avez pas besoin de '[]' dans '[\ d]'. – nickb

+0

Ouais. Fixé. Je vous remercie. – madfriend

+0

Le va émettre des avis si la regex ne correspond pas –

3

vous pouvez trouver comme vous le faites déjà, puis rechercher le numéro (Demo):

$find = strpos($text, 'Case#'); 
sscanf(substr($text, $find), 'Case#%d', $numbers); 
+0

Cela fonctionne aussi bien et c'est très simple. La seule raison pour laquelle je préférerais l'exemple de preg_match est qu'il renvoie plusieurs possibles correspondances qui, jusqu'à ce que je voyais cela, ne s'étaient pas rendu compte que cela pouvait se produire dans notre scénario. Je vous remercie! – Brad

+1

Oui, si le motif est plus général et que vous avez une répétition, 'preg_match_all' est un bon choix. J'ai édité l'autre réponse et ajouté un exemple avec 'preg_match_all'. – hakre

0

La solution la plus simple est

if (preg_match('/Case#\s*(\d+)/i', $test, $m)) { 
    $numbers = $m[1]; 
} 
Questions connexes