ฉันต้องลบตัวละครทั้งหมดออกจากสายอักขระที่ไม่ได้อยู่ในa-z A-Z 0-9
ชุดหรือไม่มีช่องว่าง
ใครบ้างมีฟังก์ชั่นการทำเช่นนี้?
ฉันต้องลบตัวละครทั้งหมดออกจากสายอักขระที่ไม่ได้อยู่ในa-z A-Z 0-9
ชุดหรือไม่มีช่องว่าง
ใครบ้างมีฟังก์ชั่นการทำเช่นนี้?
คำตอบ:
เสียงเหมือนคุณเกือบจะรู้ว่าสิ่งที่คุณต้องการจะทำแล้วคุณโดยทั่วไปกำหนดเป็น regex
preg_replace("/[^A-Za-z0-9 ]/", '', $string);
preg_replace('/[^A-Za-z0-9 ]/', '', $string);
สำหรับอักขระ Unicode มันคือ:
preg_replace("/[^[:alnum:][:space:]]/u", '', $string);
\w
รวมถึง\d
ดังนั้นจึง\d
ไม่จำเป็น นอกจากนี้ยังเป็นสิ่งที่ผิดเพราะมันจะทำให้ขีดล่างในสตริงผลลัพธ์ (ซึ่งรวมอยู่ด้วย\w
)
i
ตั้งค่าสถานะจำเป็นจริง ๆ ตั้งแต่ที่[:alnum:]
ครอบคลุมทั้งสองกรณีแล้วหรือไม่
การแสดงออกปกติคือคำตอบของคุณ
$str = preg_replace('/[^a-z\d ]/i', '', $str);
i
ยืนสำหรับกรณีตาย^
หมายถึงไม่ได้เริ่มต้นด้วย \d
ตรงกับตัวเลขใด ๆ a-z
ตรงกับตัวอักษรทั้งหมดระหว่างและa
z
เพราะi
พารามิเตอร์คุณไม่ได้มีการระบุและa-z
A-Z
\d
มีช่องว่างจึงอนุญาตให้ใช้ช่องว่างใน regex นี้นี่คือ regex ที่ง่ายมากสำหรับสิ่งนั้น:
\W|_
และใช้ตามที่คุณต้องการ (พร้อม/
ตัวคั่นเครื่องหมายสแลช)
preg_replace("/\W|_/", '', $string);
ทดสอบที่นี่ด้วยเครื่องมือที่ยอดเยี่ยมนี้ซึ่งอธิบายว่า regex กำลังทำอะไร:
/u
แฟล็กมิฉะนั้นตัวอักษรที่ไม่ใช่ ASCII จะถูกลบออกด้วย
[\W_]+
หากคุณต้องการสนับสนุนภาษาอื่นแทน AZ ทั่วไปคุณสามารถใช้สิ่งต่อไปนี้:
preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
[^\p{L}\p{N} ]
กำหนดnegated (มันจะตรงกับตัวละครที่ไม่ได้กำหนด) คลาสตัวละครของ:
\p{L}
: จดหมายจากภาษาใดก็ได้\p{N}
: อักขระตัวเลขในสคริปต์ใด ๆ
: อักขระเว้นวรรค+
อย่างตะกละตะกลามตรงกับระดับตัวละครระหว่าง 1 และไม่ จำกัดครั้งวิธีนี้จะรักษาตัวอักษรและตัวเลขจากภาษาอื่น ๆ และสคริปต์รวมถึง 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} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界
หมายเหตุ:นี่เป็นคำถามที่เก่ามาก แต่ก็ยังมีความเกี่ยวข้อง ฉันกำลังตอบอย่างหมดจดเพื่อให้ข้อมูลเสริมที่อาจเป็นประโยชน์กับผู้เข้าชมในอนาคต
[\W_]+
$string = preg_replace("/[\W_]+/u", '', $string);
มันเลือกทั้งหมดที่ไม่ใช่ AZ, az, 0-9 และลบออก
ดูตัวอย่างได้ที่นี่: https://regexr.com/3h1rj
\W
เป็นสิ่งที่ตรงกันข้ามของซึ่งเป็นตัวอักษร\w
A-Za-z0-9_
ดังนั้น\W
จะจับคู่กับตัวละครที่ไม่ได้A-Za-z0-9_
และลบออก []
เป็นเขตแดนชุดอักขระ การ+
ซ้ำซ้อนบนขอบเขตชุดอักขระ แต่โดยปกติหมายถึง 1 อักขระขึ้นไป u
ธงขยายการแสดงออกที่จะรวมถึงการสนับสนุนอักขระ Unicode ซึ่งหมายความว่ามันจะไม่ลบอักขระเกิน 255 ª²³µ
ตัวอักษรรหัสเช่น ตัวอย่างของประเพณีต่าง ๆ3v4l.org/hSVV5 ที่มีอักขระ Unicode และ ascii
preg_replace("/\W+/", '', $string)
คุณสามารถทดสอบได้ที่นี่: http://regexr.com/
ฉันกำลังมองหาคำตอบด้วยและความตั้งใจของฉันคือการทำความสะอาดทุกอย่างที่ไม่ใช่อัลฟาและไม่ควรมีมากกว่าหนึ่งช่องว่าง
ดังนั้นฉันจึงแก้ไขคำตอบของ Alex และสิ่งนี้ใช้ได้ผลสำหรับฉัน
preg_replace('/[^a-z|\s+]+/i', ' ', $name)
regex ด้านบนหันsy8ed sirajul7_islam
ไปเป็นsy ed sirajul islam
คำอธิบาย: regex จะตรวจสอบไม่ได้จาก a ถึง z ในกรณีที่ไม่มีความรู้สึกหรือมากกว่าหนึ่งช่องว่างสีขาวและมันจะถูกแปลงเป็นแบบเดี่ยว ช่องว่าง
คุณสามารถแยกสตริงออกเป็นอักขระและกรองได้
<?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()
โทรเพียงครั้งเดียวและเรียบง่าย