Trích xuất số từ một chuỗi


332

Tôi muốn trích xuất các số từ một chuỗi có chứa các số và chữ như:

"In My Cart : 11 items"

Tôi muốn ở đây để có được số 11hoặc bất kỳ số nào khác.


Sử dụng $ string = "Trong giỏ hàng của tôi: 11 mặt hàng"; $ number = preg numplace ("/ [^ 0-9] {1,4} /", '', $ chuỗi); // trở về 11
Shorabh

Câu trả lời:


363
$str = 'In My Cart : 11 12 items';
preg_match_all('!\d+!', $str, $matches);
print_r($matches);

2
Làm thế nào tôi có thể nhận được số của mình trong một biến đơn giản và không phải trong mảng?
Bizboss

34
$ var = implode ('', $ khớp [0]);
Gaurav

2
@Bizboss Trong một tĩnh mạch tương tự, hãy thử $newstr = preg_replace('!\d+!', '', $str);. Nó sẽ loại bỏ tất cả các chữ số từ chuỗi của bạn. Ví dụ: $str = 'In My Cart : 11 12 items';sẽ xuất In My Cart : items.
Aether

77
thi không phải là một cách thân thiện với tài nguyên. sử dụng preg_replace("/[^0-9]/","",$string);hoặcfilter_var($str, FILTER_SANITIZE_NUMBER_INT);
eapo

6
@eapo filter_var($str, FILTER_SANITIZE_NUMBER_INT);trích xuất các chữ số, dấu cộngdấu trừ . Các regex chỉ trích xuất các chữ số!
PATROMO

535

Nếu bạn chỉ muốn lọc mọi thứ ngoài các số, cách dễ nhất là sử dụng bộ lọc_var :

$str = 'In My Cart : 11 items';
$int = (int) filter_var($str, FILTER_SANITIZE_NUMBER_INT);

56
Một dấu gạch ngang trước một số sẽ được coi là một điểm trừ.
Elnur Abdurrakhimov

43
Không chỉ trước số. Bất kỳ +/- sẽ không bị cắt ngắn. Nếu bạn có xxx-yyy-24bạn sẽ nhận được --24. Bạn có thể sử dụng str_repleace(array('+','-'), '', $result)để xóa cả hai dấu hiệu.
imclickingmaniac

4
@imclickingmaniac bạn chỉ có thể làm max(0,filter_var($str, FILTER_SANITIZE_NUMBER_INT))thay vì sử dụng mảng và thay thế chuỗi.
Eduard

2
sử dụng max () cũng trả về dấu trừ trong chuỗi, hy vọng strreplace () là tùy chọn ở đây. Cảm ơn lời khuyên.
Shiva Avula

26
abs((int) filter_var($str, FILTER_SANITIZE_NUMBER_INT));
MECU 11/9/2015

300
preg_replace('/[^0-9]/', '', $string);

Điều này sẽ làm công việc tốt hơn! ...


10
Tôi thích điều này bởi vì nó trả về một chuỗi, không phải là một mảng như các ví dụ với preg_match_all làm và tôi thích nó bởi vì tôi chỉ muốn số chứ không phải dấu cộng hoặc dấu gạch ngang, như ví dụ của bộ lọc_var.
Darrell Duane

43
Trở nên tuyệt vời với phương pháp này: một cái gì đó như 'In My Car_Price: 500.00sẽ in:50000
ErickBest

16
@ErickBest Đó là một điều tốt, xem xét câu hỏi là extract the numbers from a string- dấu thập phân không phải là số!
rybo111

1
Đây là một nitpick nhưng có lẽ bạn muốn sử dụng dấu ngoặc đơn 'và không phải dấu ngoặc kép ".
CommandZ

16
preg numplace ('/ [^ 0-9.] /', '', 'abc1.22'); // trả về số thập phân 1,22
zzapper

84

Sử dụng preg_replace:

$str = '(111) 111-1111';
$str = preg_replace('/\D/', '', $str);
echo $str;

Đầu ra: 1111111111


4
Nó hoạt động rất tốt. Nó chuyển đổi +387 (61) 634-783chuỗi thành 38761634783trực tiếp. Bạn không cần phải quan tâm đến các mảng như câu trả lời của Gaurav.
beyt Swarovski

1
Chắc chắn là câu trả lời tốt nhất. sandbox.onlinephpfifts.com/code/ trộm
Steffan

Tôi khuyên bạn nên +định lượng để khớp các trận đấu dài hơn / ít lần thay thế hơn.
mickmackusa

21

Đối với số nổi,

preg_match_all('!\d+\.?\d+!', $string ,$match);

Cảm ơn đã chỉ ra sai lầm. @mickmackusa


Nó thực sự sai :) Nó nên là'!\d*.?\d+!'
Yash

Tôi muốn sử dụng ?như là bộ định lượng của dấu chấm. Tôi sẽ không mong đợi một giá trị nổi có chứa nhiều ký hiệu dấu thập phân. Mô hình bình luận của Yash là sai trớ trêu. Dấu chấm cần một dấu gạch chéo ở phía trước để làm cho nó theo nghĩa đen.
mickmackusa

11

Tôi không sở hữu tín dụng cho việc này, nhưng tôi chỉ phải chia sẻ nó. Regex này sẽ nhận được các số từ một chuỗi, bao gồm các dấu thập phân / vị trí, cũng như dấu phẩy:

/((?:[0-9]+,)*[0-9]+(?:\.[0-9]+)?)/

Trích dẫn từ đây:
php - regex - làm thế nào để trích xuất một số có số thập phân (dấu chấm và dấu phẩy) từ một chuỗi (ví dụ: 1.120,01)?


Đây không phải là xác nhận chuỗi cho một dấu phẩy giữa các bộ ba số nguyên. ... vấn đề với việc sao chép mẫu của người khác và không hiểu / kiểm tra nó.
mickmackusa


9

Sử dụng preg numplace

$str = 'In My Cart : 11 12 items';
$str = preg_replace('/\D/', '', $str);
echo $str;

Tôi khuyên bạn nên +định lượng để khớp các trận đấu dài hơn / ít lần thay thế hơn.
mickmackusa

6

Bạn có thể sử dụng chức năng sau:

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

   return $match[0];
}

Không có lợi ích để viết \dbên trong một lớp nhân vật. Vì bạn đang truy cập vào kết hợp chuỗi đầy đủ, không có ý nghĩa gì khi viết một nhóm chụp vào mẫu.
mickmackusa

4
preg_match_all('!\d+!', $some_string, $matches);
$string_of_numbers = implode(' ', $matches[0]);

Đối số đầu tiên trong mã hóa trong trường hợp cụ thể này cho biết "tách từng phần tử trong khớp [0] với một khoảng trắng". Implode sẽ không đặt dấu cách (hoặc bất kể đối số đầu tiên của bạn là gì) trước số đầu tiên hoặc sau số cuối cùng.

Một thứ khác cần lưu ý là $ khớp [0] là nơi lưu trữ các mảng trùng khớp (khớp với biểu thức chính quy này).

Để làm rõ hơn về những gì các chỉ mục khác trong mảng được xem: http://php.net/manual/en/feft.preg-match-all.php



3
$value = '25%';

Hoặc là

$value = '25.025$';

Hoặc là

$value = 'I am numeric 25';
$onlyNumeric = filter_var($value, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);

Điều này sẽ chỉ trả về giá trị số



3

Thực hiện theo bước này, nó sẽ chuyển đổi chuỗi thành số

$value = '$0025.123';
$onlyNumeric = filter_var($value, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
settype($onlyNumeric,"float");

$result=($onlyNumeric+100);
echo $result;

Một cách khác để làm điều đó:

$res = preg_replace("/[^0-9.]/", "", "$15645623.095605659");

0

cách khác (chuỗi unicode chẵn):

$res = array();
$str = 'test 1234 555 2.7 string ..... 2.2 3.3';
$str = preg_replace("/[^0-9\.]/", " ", $str);
$str = trim(preg_replace('/\s+/u', ' ', $str));
$arr = explode(' ', $str);
for ($i = 0; $i < count($arr); $i++) {
    if (is_numeric($arr[$i])) {
        $res[] = $arr[$i];
    }
}
print_r($res); //Array ( [0] => 1234 [1] => 555 [2] => 2.7 [3] => 2.2 [4] => 3.3 ) 

0

Kịch bản lệnh này tạo một tệp lúc đầu, ghi số vào một dòng và thay đổi thành dòng tiếp theo nếu nhận được một ký tự không phải là số. Cuối cùng, một lần nữa, nó sắp xếp các con số vào một danh sách.

string1 = "hello my name 12 is after 198765436281094and14 and 124de"
f= open("created_file.txt","w+")
for a in string1:
    if a in ['1','2','3','4','5','6','7','8','9','0']:
        f.write(a)
    else:
        f.write("\n" +a+ "\n")
f.close()


#desired_numbers=[x for x in open("created_file.txt")]

#print(desired_numbers)

k=open("created_file.txt","r")
desired_numbers=[]
for x in k:
    l=x.rstrip()
    print(len(l))
    if len(l)==15:
        desired_numbers.append(l)


#desired_numbers=[x for x in k if len(x)==16]
print(desired_numbers)

-1

Tùy thuộc vào trường hợp sử dụng của bạn, đây cũng có thể là một tùy chọn:

$str = 'In My Cart : 11 items';
$num = '';

for ($i = 0; $i < strlen($str); $i++) {

    if (is_numeric($str[$i])) {
        $num .= $str[$i];
    }
}

echo $num; // 11

Mặc dù tôi đồng ý một biểu thức chính quy hoặc filter_var()sẽ hữu ích hơn trong trường hợp đã nêu.


-1

cho utf8 str:

function unicodeStrDigits($str) {
    $arr = array();
    $sub = '';
    for ($i = 0; $i < strlen($str); $i++) { 
        if (is_numeric($str[$i])) {
            $sub .= $str[$i];
            continue;
        } else {
            if ($sub) {
                array_push($arr, $sub);
                $sub = '';
            }
        }
    }

    if ($sub) {
        array_push($arr, $sub); 
    }

    return $arr;
}

-1

Nếu bạn không biết định dạng nào là số? int hoặc nổi, sau đó sử dụng này:

$string = '$125.22';

$string2 = '$125';

preg_match_all('/(\d+.?\d+)/',$string,$matches); // $matches[1] = 125.22

preg_match_all('/(\d+.?\d+)/',$string2,$matches); // $matches[1] = 125

-1

Hàm này cũng sẽ xử lý các số nổi

$str = "Doughnuts, 4; doughnuts holes, 0.08; glue, 3.4";
$str = preg_replace('/[^0-9\.]/','-', $str);
$str = preg_replace('/(\-+)(\.\.+)/','-', $str);
$str = trim($str, '-');
$arr = explode('-', $str);

Giới thiệu dấu gạch ngang cho quá trình này là hoàn toàn không cần thiết. Câu trả lời này cũng thiếu một lời giải thích về cách thức hoạt động và lý do tại sao bạn cảm thấy đó là một ý tưởng tốt.
mickmackusa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.