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);
\w
bao gồm \d
và do đó \d
là 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
).
i
cờ 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);
i
viế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-z
phù hợp với tất cả các nhân vật giữa a
và z
. Do i
tham số bạn không phải chỉ định a-z
và A-Z
.\d
có 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:
/u
cờ 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
\W
là nghịch đảo trong \w
đó là các ký tự A-Za-z0-9_
. Vì vậy, \W
sẽ 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 u
cờ 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_islam
sang 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 .