2011-01-29 10 views
11

zakładając, że mam te teksty "x34", "150px", "650dpi", "e3r4t5" ... jak mogę uzyskać tylko liczby? Chodzi mi o to, że chcę 34, 150, 650, 345 bez żadnej innej postaci. Chodzi o to, aby uzyskać liczby, które ten ciąg ma w jednej zmiennej.Odfiltruj liczby w łańcuchu znaków w php

Odpowiedz

13

Przepraszamy za przystąpienie do zwycięzcy późno, niż przy użyciu regex, proponuję użyć PHP wbudowane funkcje, które mogą być szybciej niż Regex .

filter_var

flags for the filters

np aby uzyskać tylko liczby z podanego ciągu znaków:

<?php 
$a = '[email protected]+dk9.0$3e8`~]\]2'; 
$number = str_replace(['+', '-'], '', filter_var($a, FILTER_SANITIZE_NUMBER_INT)); 
// Output is 390382 
?> 

Aby zachować bardziej rygorystyczne standardy dla Twojego pytania, zaktualizowałem swoją odpowiedź, aby uzyskać lepszy wynik.

Dodałem str_replace, jak FILTER_SANITIZE_NUMBER_FLOAT lub INT flaga nie obetnie + i - znaki z łańcucha, ponieważ są one częścią Wyjątek PHP.

Mimo że filtr ma długą żywotność, ale teraz ma mniejsze szanse na niepowodzenie lub daje nieoczekiwane wyniki, a to będzie szybsze niż REGEX.

Edit:

1: sobie sprawę, że z FILTER_SANITIZE_NUMBER_FLOAT, PHP nie będzie rozebrać te znaki opcjonalnie.,eE, stąd dostać tylko czysty numery łaskawie używać FILTER_SANITIZE_NUMBER_INT

2: Jeśli masz wersję PHP mniejszą niż 5.4, użyj zamiast niej krótkiej składni .

11

Można użyć wyrażenia regularnego usunąć dowolny znak, który nie jest cyfrą:

preg_replace('/\D/', '', $str) 

Oto wzór \D opisuje dowolny znak, który nie jest cyfrą (uzupełnienie \d).

19
$str = "e3r4t5"; 
$str_numbers_only = preg_replace("/[^\d]/", "", $str); 

// $number = (int) $str; 
+1

dokładnie. http://ideone.com/WKtth –

+0

dlaczego nie korzystać z funkcji filtrowania PHP od teraz, co jest zalecane. Poniżej znajduje się moja odpowiedź poniżej: – Haijerome

2

Zamień wszystko, co nie jest liczbą, i użyj tej wartości.

$str = "foo1bar2baz3"; 
$num = intval(preg_replace("/[^0-9]/", "", $str)); 
+0

Domyślam się, że powyższa odpowiedź jest bardziej skuteczna, biorąc pod uwagę użycie na milionach jednostek. –

6

Użyj funkcji FILTRA PHP, jeśli używasz PHP 5.2.X, 5.3.x, 5.4. Jest wysoce zalecane

$mixed_input = "e3r4t5"; 
$only_numbers = filter_var($mixed_input, FILTER_SANITIZE_NUMBER_INT); 

Proszę przejść z this link wiedzieć więcej

+1

Zgadzam się, to jest zalecane. Jednak nie może działać zgodnie z oczekiwaniami, jeśli parametr mixed_input zawiera znaki "+" lub "-", ponieważ nie są one filtrowane, nawet w środku ciągu znaków. – Julien

1

można użyć następujących funkcji

extract_numbers function ($ string) {

preg_match_all ('/ ([\ d] +) /', $ string, $ match);

return $ match;

}

+0

To działa dla mnie :) – Jasmeen

Powiązane problemy