ฉันต้องลบตัวละครทั้งหมดออกจากสายอักขระที่ไม่ได้อยู่ใน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-zA-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()โทรเพียงครั้งเดียวและเรียบง่าย