Hàm chỉ trả về các ký tự chữ-số từ chuỗi?


98

Tôi đang tìm một hàm php sẽ lấy một chuỗi đầu vào và trả về phiên bản đã được khử trùng của nó bằng cách loại bỏ tất cả các ký tự đặc biệt, chỉ để lại chữ-số.

Tôi cần một hàm thứ hai thực hiện tương tự nhưng chỉ trả về các ký tự chữ cái AZ.

Bất kỳ giúp đỡ nhiều đánh giá cao.


Những biểu mẫu này thuộc dạng chuẩn hóa Unicode nào, và tại sao bạn lại muốn làm điều này?
tchrist

1
Khi bạn nói AZ và 'alphanumeric', bạn có thực sự muốn nói chỉ AZ hay bạn muốn đối sánh tất cả các chữ cái từ tất cả các ngôn ngữ, bao gồm cả tiếng nước ngoài và các chữ viết lỗi thời?
Mark Byers

Nếu bạn làm điều này để có thể so sánh chuỗi không phân biệt trọng âm thì bạn đang làm sai.
tchrist

3
không chỉ là "từ tất cả các ngôn ngữ". Nó là tiếng Anh. Tiếng Anh sử dụng hệ thống chữ Latinh. Có unichars '\p{Latin}' '\p{Alphabetic}' '[^A-Za-z]' | wc -l== 1192 điểm mã là bảng chữ cái Latinh nhưng không phải là AZ. Người ta thường lầm tưởng rằng ASCII là đủ cho tiếng Anh. Nó không phải, và đó là lý do tại sao viết AZ có một mùi mã cho nó.
tchrist

1
@Scott B: Tiếng Anh không chỉ sử dụng 26 chữ cái từ AZ. Ví dụ từ résumé bao gồm é. Có lẽ bạn có thể giải thích những gì bạn đang cố gắng làm vì điều này có thể giúp bạn có câu trả lời tốt hơn.
Mark Byers

Câu trả lời:


212

Cảnh báo: Lưu ý rằng tiếng Anh không chỉ giới hạn ở AZ.

Hãy thử điều này để xóa mọi thứ ngoại trừ az, AZ và 0-9:

$result = preg_replace("/[^a-zA-Z0-9]+/", "", $s);

Nếu định nghĩa của bạn về chữ và số bao gồm các chữ cái bằng tiếng nước ngoài và các chữ viết lỗi thời thì bạn sẽ cần sử dụng các lớp ký tự Unicode.

Hãy thử điều này để chỉ để lại AZ:

$result = preg_replace("/[^A-Z]+/", "", $s);

Lý do cho cảnh báo là những từ như résumé chứa chữ cái énày sẽ không khớp với cái này. Nếu bạn muốn khớp với một danh sách các chữ cái cụ thể, hãy điều chỉnh cụm từ thông dụng để bao gồm các chữ cái đó. Nếu bạn muốn khớp tất cả các chữ cái, hãy sử dụng các lớp ký tự thích hợp như đã đề cập trong các nhận xét.


2
Không, một chữ và số là [\p{Alphabetic}\p{Numeric}]. Tôi quên thuộc tính bảng chữ cái PCRE, nhưng bạn có thể tính gần đúng với [\pL\pM\pN].
tchrist

1
@tchrist: Tôi cho rằng vì anh ấy đã đề cập cụ thể đến AZ nên anh ấy chỉ muốn so khớp điều đó, mặc dù tôi thừa nhận rằng câu hỏi có thể rõ ràng hơn nhiều về điểm này. Tôi sẽ yêu cầu làm rõ.
Mark Byers

1
@Mark, tôi đã không tranh luận với phần thứ hai của câu trả lời của bạn, mặc dù nếu anh ấy không phân tách chuỗi theo quy tắc trước, nó sẽ không hoạt động đúng. Tôi đã tranh luận với phần đầu tiên. Ngoài ra, tôi cố gắng luôn luôn đúng các regex hoạt động trên mọi dữ liệu, không chỉ trên ASCII cũ mốc. :) Do đó, câu thần chú mà phía bên này của Millennium [A-Z], đôi khi luôn sai .
tchrist

1
@Mark Byers, tôi hiểu rồi .. và Vâng, tôi thích điều đó hơn inhưng tôi chỉ phải lo lắng về nhân khẩu học tiếng Anh .. Tôi quên rằng nhiều người phải nghĩ về các ngôn ngữ khác. BTW Tôi vừa nhận thấy bạn là người dùng có số lượt đại diện cao nhất chưa bao giờ hỏi 1 câu hỏi nào. Ngay cả Jon Skeet cũng đã từng đặt câu hỏi!
JD Isaacks

1
tại sao lại có dấu + ở cuối regexp? Nó sẽ không giống nhau nếu bạn xóa nó đi?
Dennis

2

Thay vào đó preg_replace, bạn luôn có thể sử dụng các hàm bộ lọc của PHP bằng cách sử dụng filter_var()hàm với FILTER_SANITIZE_STRING.


PHP có quyền truy cập vào thuật toán ISO Stringprep không? Tôi biết Perl và Java.
tchrist

Tôi tin rằng chức năng lọc chuỗi hoạt động chủ yếu với ASCII 7-bit, nhưng không trích dẫn tôi về điều đó.
Mark Baker

30
Làm ơn, bạn có thể cho chúng tôi biết một cách rõ ràng để thực hiện những gì người dùng đang yêu cầu sử dụng FILTER_SANITIZE_STRINGkhông? Theo hiểu biết của tôi, thứ gần nhất có thể được lưu trữ theo cách này là với FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH, nhưng điều đó sẽ không chỉ để lại các chữ cái và số mà còn có các dấu chấm, dấu gạch chéo, phần trăm và tất cả.
Pere

$ iMycleanVar = filter_var ($ sStringWithNumbers, FILTER_SANITIZE_NUMBER_INT);
Sultanos

4
Nó trông giống như một bình luận hơn là một câu trả lời. Đưa ra lời giải thích thích hợp trong khi viết câu trả lời.
Siraj Alam

0
  1. Santize cho các số [ 0-9 ] và bảng chữ cái nói chung [ \ pL ]:
$string = preg_replace("/[^0-9\pL]+/", "", $string)
  1. Santize cụ thể cho các bảng chữ cái từ A đến Z (không phân biệt chữ hoa chữ thường) [ a-zA-Z ]:
$string = preg_replace("/[^a-zA-Z]+/", "", $string)
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.