Câu trả lời:
Âm thanh như bạn gần như đã biết những gì bạn muốn làm, về cơ bản bạn đã định nghĩa nó là một regex.
preg_replace("/[^A-Za-z0-9 ]/", '', $string);
preg_replace('/[^A-Za-z0-9 ]/', '', $string);
Đối với các ký tự unicode, đó là:
preg_replace("/[^[:alnum:][:space:]]/u", '', $string);
\wbao gồm \dvà do đó \dlà không cần thiết. Ngoài ra, điều này là sai bởi vì nó cũng sẽ để lại dấu gạch dưới trong chuỗi kết quả (cũng được bao gồm trong \w).
icờ thực sự cần thiết ở đây vì [:alnum:]đã bao gồm cả hai trường hợp?
Biểu hiện thường xuyên là câu trả lời của bạn.
$str = preg_replace('/[^a-z\d ]/i', '', $str);
iviết tắt cho trường hợp không nhạy cảm.^ có nghĩa là, không bắt đầu với. \d phù hợp với bất kỳ chữ số. a-zphù hợp với tất cả các nhân vật giữa avà z. Do itham số bạn không phải chỉ định a-zvà A-Z.\dcó một khoảng trắng, vì vậy các khoảng trắng được cho phép trong biểu thức chính quy này.Đây là một regex thực sự đơn giản cho điều đó:
\W|_
và được sử dụng khi bạn cần nó (với /dấu phân cách dấu gạch chéo về phía trước ).
preg_replace("/\W|_/", '', $string);
Kiểm tra nó ở đây với công cụ tuyệt vời này giải thích những gì regex đang làm:
/ucờ nếu không các chữ cái không phải ascii cũng bị xóa.
[\W_]+
Nếu bạn cần hỗ trợ các ngôn ngữ khác, thay vì AZ thông thường, bạn có thể sử dụng các ngôn ngữ sau:
preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
[^\p{L}\p{N} ]định nghĩa một lớp ký tự phủ định (Nó sẽ khớp với một ký tự không được xác định) của lớp:
\p{L}: một lá thư từ bất kỳ ngôn ngữ.\p{N}: một ký tự số trong bất kỳ tập lệnh nào .: một nhân vật không gian.+ tham lam phù hợp với lớp nhân vật từ 1 đến không giới hạn .Điều này sẽ bảo vệ các chữ cái và số từ các ngôn ngữ và tập lệnh khác cũng như AZ:
preg_replace('/[^\p{L}\p{N} ]+/', '', 'hello-world'); // helloworld
preg_replace('/[^\p{L}\p{N} ]+/', '', 'abc@~#123-+=öäå'); // abc123öäå
preg_replace('/[^\p{L}\p{N} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界
Lưu ý: Đây là một câu hỏi rất cũ, nhưng vẫn có liên quan. Tôi đang trả lời hoàn toàn để cung cấp thông tin bổ sung có thể hữu ích cho khách truy cập trong tương lai.
[\W_]+
$string = preg_replace("/[\W_]+/u", '', $string);
Nó chọn tất cả không phải AZ, az, 0-9 và xóa nó.
Xem ví dụ tại đây: https://regexr.com/3h1rj
\Wlà nghịch đảo trong \wđó là các ký tự A-Za-z0-9_. Vì vậy, \Wsẽ phù hợp với bất kỳ nhân vật không phải là A-Za-z0-9_và loại bỏ chúng. Đây []là một ranh giới thiết lập nhân vật . Cái +thừa là trên một ranh giới tập ký tự nhưng thông thường có nghĩa là 1 hoặc nhiều ký tự. Các ucờ mở rộng khái niệm bao gồm hỗ trợ ký tự unicode, có nghĩa là nó sẽ không loại bỏ ký tự vượt quá 255 ký tự mã như ª²³µ. Ví dụ về các cách sử dụng khác nhau 3v4l.org/hSVV5 với các ký tự unicode và ascii.
preg_replace("/\W+/", '', $string)
Bạn có thể kiểm tra nó ở đây: http://regexr.com/
Tôi cũng đang tìm câu trả lời và ý định của tôi là dọn sạch mọi phi alpha và không nên có nhiều hơn một không gian.
Vì vậy, tôi đã sửa đổi câu trả lời của Alex cho vấn đề này và điều này có hiệu quả với tôi
preg_replace('/[^a-z|\s+]+/i', ' ', $name)
. Regex ở trên đã chuyển sy8ed sirajul7_islamsang sy ed sirajul islam
Giải thích: regex sẽ kiểm tra KHÔNG BẤT K from từ a đến z trong trường hợp không nhạy cảm hoặc nhiều hơn một khoảng trắng và nó sẽ được chuyển đổi thành một không gian.
Bạn có thể chia chuỗi thành các ký tự và lọc nó.
<?php
function filter_alphanum($string) {
$characters = str_split($string);
$alphaNumeric = array_filter($characters,"ctype_alnum");
return join($alphaNumeric);
}
$res = filter_alphanum("a!bc!#123");
print_r($res); // abc123
?>
preg_replace()cuộc gọi đơn giản và đơn giản .