Cách trích xuất số từ chuỗi php?

Phương pháp tốt nhất/hiệu quả nhất để trích xuất một bộ số cụ thể từ một chuỗi là gì? . Tôi muốn lấy bộ số ngay sau Case# vào mùa xuân "blah blah Case#004522 blah blah". Tôi tưởng tượng số lượng ký tự số sau Case# sẽ luôn giống nhau nhưng tôi muốn mã không đưa ra giả định đó như tôi đã từng

Cho đến nay, tôi đã sử dụng phương thức strpos để xác định vị trí Case# và sau đó lấy một số ký tự cụ thể cho lời bạt bằng cách sử dụng chất nền. Tôi chỉ cảm thấy như thế này là vụng về. Có lẽ preg_match sẽ hiệu quả hơn hoặc đơn giản hơn?

$text = "blah blah Case#004552 blah blah";
$find = strpos[$text,'Case#'];
if [ $find ]
  $numbers = substr[$text, $find+5, 6];

Giải pháp tốt nhất

Bạn có thể sử dụng các biểu thức chính quy để khớp mẫu ký tự đầu tiên của mình [

$numbers = preg_match["/Case#[\d+]/", $text, $matches]
              ? [int]$matches[1]
              : NULL
    ;
unset[$matches];
4] và sau đó bạn chỉ muốn khớp các số [chữ số], đó là
$numbers = preg_match["/Case#[\d+]/", $text, $matches]
              ? [int]$matches[1]
              : NULL
    ;
unset[$matches];
5 trong PCRE [Bản trình diễn]

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

Đối với nhiều trận đấu [số nguyên] cùng một lúc

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

Giải pháp liên quan

Python – Cách tốt nhất để tách dấu câu khỏi chuỗi

Từ góc độ hiệu quả, bạn sẽ không đánh bại

s.translate[None, string.punctuation]

Đối với các phiên bản Python cao hơn, hãy sử dụng đoạn mã sau

s.translate[str.maketrans['', '', string.punctuation]]

Nó đang thực hiện các thao tác chuỗi thô trong C bằng bảng tra cứu - không có nhiều thứ có thể đánh bại điều đó ngoài việc viết mã C của riêng bạn

Nếu tốc độ không phải là vấn đề đáng lo ngại, thì một tùy chọn khác là

exclude = set[string.punctuation]
s = ''.join[ch for ch in s if ch not in exclude]

Cái này nhanh hơn s. thay thế bằng từng ký tự, nhưng sẽ không hoạt động tốt như các cách tiếp cận python không thuần túy như biểu thức chính quy hoặc chuỗi. dịch, như bạn có thể thấy từ thời gian bên dưới. Đối với loại vấn đề này, làm nó ở mức thấp nhất có thể sẽ được đền đáp

mã thời gian

________số 8

Điều này mang lại kết quả sau

sets      : 19.8566138744
regex     : 6.86155414581
translate : 2.12455511093
replace   : 28.4436721802

Java – Cách tạo chuỗi Java từ nội dung của tệp

Đọc tất cả văn bản từ một tập tin

Java 11 đã thêm phương thức đọc các tệp nhỏ dưới dạng

$numbers = preg_match["/Case#[\d+]/", $text, $matches]
              ? [int]$matches[1]
              : NULL
    ;
unset[$matches];
6, giữ nguyên các dấu kết thúc dòng

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

Đối với các phiên bản giữa Java 7 và 11, đây là một thành ngữ nhỏ gọn, mạnh mẽ, được gói gọn trong một phương thức tiện ích

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

Đọc các dòng văn bản từ một tập tin

Java 7 đã thêm một đại diện là một

$numbers = preg_match["/Case#[\d+]/", $text, $matches]
              ? [int]$matches[1]
              : NULL
    ;
unset[$matches];
7. Cách tiếp cận này là "mất mát" vì các dấu phân cách dòng bị loại bỏ khỏi cuối mỗi dòng

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

Java 8 đã thêm phương thức để tạo một

$numbers = preg_match["/Case#[\d+]/", $text, $matches]
              ? [int]$matches[1]
              : NULL
    ;
unset[$matches];
9. Một lần nữa, phương pháp này bị mất dữ liệu vì các dấu phân cách dòng bị loại bỏ. Nếu gặp phải một
$numbers = preg_match_all["/Case#[\d+]/", $text, $matches]
              ? array_map['intval', $matches[1]]
              : NULL
    ;
unset[$matches];
0 trong khi đọc tệp, nó sẽ được bọc trong một
$numbers = preg_match_all["/Case#[\d+]/", $text, $matches]
              ? array_map['intval', $matches[1]]
              : NULL
    ;
unset[$matches];
1, vì
$numbers = preg_match_all["/Case#[\d+]/", $text, $matches]
              ? array_map['intval', $matches[1]]
              : NULL
    ;
unset[$matches];
2 không chấp nhận lambdas ném các ngoại lệ đã kiểm tra

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

$numbers = preg_match_all["/Case#[\d+]/", $text, $matches]
              ? array_map['intval', $matches[1]]
              : NULL
    ;
unset[$matches];
2 này cần một cuộc gọi; . Đảm bảo sử dụng khối ARM như được hiển thị

Nếu bạn đang làm việc với một nguồn không phải là một tệp, bạn có thể sử dụng phương pháp này trong

$numbers = preg_match_all["/Case#[\d+]/", $text, $matches]
              ? array_map['intval', $matches[1]]
              : NULL
    ;
unset[$matches];
8 để thay thế

Sử dụng bộ nhớ

Phương pháp đầu tiên, bảo toàn các ngắt dòng, có thể tạm thời yêu cầu bộ nhớ gấp nhiều lần kích thước của tệp, vì trong một thời gian ngắn, nội dung tệp thô [một mảng byte] và các ký tự được giải mã [mỗi ký tự là 16 bit ngay cả khi được mã hóa . An toàn nhất là áp dụng cho các tệp mà bạn biết là nhỏ so với bộ nhớ khả dụng

Phương pháp thứ hai, đọc các dòng, thường hiệu quả hơn về bộ nhớ vì bộ đệm byte đầu vào để giải mã không cần chứa toàn bộ tệp. Tuy nhiên, nó vẫn không phù hợp với các tệp rất lớn so với bộ nhớ khả dụng

Để đọc các tệp lớn, bạn cần một thiết kế khác cho chương trình của mình, một thiết kế đọc một đoạn văn bản từ một luồng, xử lý nó rồi chuyển sang phần tiếp theo, sử dụng lại cùng một khối bộ nhớ có kích thước cố định. Ở đây, "lớn" phụ thuộc vào thông số kỹ thuật của máy tính. Ngày nay, ngưỡng này có thể là nhiều gigabyte RAM. Phương pháp thứ ba, sử dụng

$numbers = preg_match["/Case#[\d+]/", $text, $matches]
              ? [int]$matches[1]
              : NULL
    ;
unset[$matches];
9 là một cách để thực hiện việc này, nếu "bản ghi" đầu vào của bạn là các dòng riêng lẻ. [Sử dụng phương pháp
s.translate[None, string.punctuation]
0 của
$numbers = preg_match_all["/Case#[\d+]/", $text, $matches]
              ? array_map['intval', $matches[1]]
              : NULL
    ;
unset[$matches];
8 là quy trình tương đương với phương pháp này. ]

Mã hóa ký tự

Một thứ còn thiếu trong mẫu trong bài viết gốc là mã hóa ký tự. Có một số trường hợp đặc biệt mà nền tảng mặc định là những gì bạn muốn, nhưng chúng rất hiếm và bạn sẽ có thể biện minh cho lựa chọn của mình

Lớp

s.translate[None, string.punctuation]
2 định nghĩa một số hằng số cho mã hóa được yêu cầu của tất cả thời gian chạy Java

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

Nền tảng mặc định có sẵn từ chính nó

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

Ghi chú. Câu trả lời này phần lớn thay thế phiên bản Java 6 của tôi. Tiện ích của Java 7 đơn giản hóa mã một cách an toàn và câu trả lời cũ, sử dụng bộ đệm byte được ánh xạ, đã ngăn không cho tệp đã đọc bị xóa cho đến khi bộ đệm được ánh xạ được thu gom rác. Bạn có thể xem phiên bản cũ qua liên kết "đã chỉnh sửa" trên câu trả lời này

Chủ Đề