วิธีลบอักขระที่ไม่ใช่ตัวอักษรและตัวเลขออกได้อย่างไร


350

ฉันต้องลบตัวละครทั้งหมดออกจากสายอักขระที่ไม่ได้อยู่ในa-z A-Z 0-9ชุดหรือไม่มีช่องว่าง

ใครบ้างมีฟังก์ชั่นการทำเช่นนี้?

คำตอบ:


697

เสียงเหมือนคุณเกือบจะรู้ว่าสิ่งที่คุณต้องการจะทำแล้วคุณโดยทั่วไปกำหนดเป็น regex

preg_replace("/[^A-Za-z0-9 ]/", '', $string);

8
zuk1: regexbuddy เป็นตัวช่วยที่ยอดเยี่ยมสำหรับเรื่องนั้น
relipse

2
นี่คือตัวอย่างถ้าคุณต้องการใส่ยัติภังค์เป็นตัวละครที่ได้รับอนุญาต ฉันต้องการสิ่งนี้เพราะฉันต้องการตัดอักขระที่ไม่อนุญาตออกจากชื่อผู้ใช้ Moodle ตามที่อยู่อีเมล: preg_replace ("/ [^ a-z0-9 _. @ \ -] /", '', $ string);
Evan Donovan

2
สิ่งนี้จะทำงานได้เหมือนกันกับเครื่องหมายอัญประกาศเดี่ยว (อัญประกาศเดี่ยว) รอบนิพจน์ปกติแทนที่จะเป็นเครื่องหมายคำพูด (เครื่องหมายคำพูดคู่) หรือไม่ เช่น:preg_replace('/[^A-Za-z0-9 ]/', '', $string);
2540625

3
เราต้องการคำอธิบายเกี่ยวกับเรื่องนี้ :) ผู้คนมาที่นี่เพื่อดูว่าทำไมมันถึงเป็นอย่างนั้น โปรดพิจารณาคำอธิบายของ Regex ด้วย! ขอบคุณ
Pratik

1
ถ้าเราต้องการรักษาตัวละครที่เน้นเสียงไว้ล่ะ?
wonzbak

169

สำหรับอักขระ Unicode มันคือ:

preg_replace("/[^[:alnum:][:space:]]/u", '', $string);

สวัสดี voondo สิ่งที่มี / ui สิ่ง .. คุณเรียกมันว่าอะไร? ทุกคนได้โปรดส่องแสงให้ฉันหน่อยได้ไหม ขอบคุณ.
kebyang

4
สำหรับการชี้แจงพวกเขาเรียกว่าธง พวกมันจะถูกวางไว้หลังตัวคั่นการปิด (ในกรณีนี้คือ "/" แต่อาจเป็น "~" หรือ "@" หรือตัวละครที่คุณต้องการใช้ตราบเท่าที่ตัวคั่นการเปิดและปิดนั้นเหมือนกัน) และเปลี่ยน พฤติกรรมของการแสดงออก
Doktor J

1
Btw \wรวมถึง\dดังนั้นจึง\dไม่จำเป็น นอกจากนี้ยังเป็นสิ่งที่ผิดเพราะมันจะทำให้ขีดล่างในสตริงผลลัพธ์ (ซึ่งรวมอยู่ด้วย\w)
smathy

2
ยังมีข้อผิดพลาดในเรื่องนี้คลาสอักขระต้องถูกยกเลิกด้วย ':]' ดังนั้นบรรทัดที่ถูกต้องจะเป็น: preg_replace ("/ [^ [: alnum:] [: space:]] / ui", '', $ string);
h00ligan

4
การiตั้งค่าสถานะจำเป็นจริง ๆ ตั้งแต่ที่[:alnum:]ครอบคลุมทั้งสองกรณีแล้วหรือไม่
billynoah

50

การแสดงออกปกติคือคำตอบของคุณ

$str = preg_replace('/[^a-z\d ]/i', '', $str);
  • iยืนสำหรับกรณีตาย
  • ^ หมายถึงไม่ได้เริ่มต้นด้วย
  • \d ตรงกับตัวเลขใด ๆ
  • a-zตรงกับตัวอักษรทั้งหมดระหว่างและa zเพราะiพารามิเตอร์คุณไม่ได้มีการระบุและa-zA-Z
  • หลังจาก\dมีช่องว่างจึงอนุญาตให้ใช้ช่องว่างใน regex นี้

3
เราต้องการคำอธิบายเกี่ยวกับเรื่องนี้ :) ผู้คนมาที่นี่เพื่อดูว่าทำไมมันถึงเป็นอย่างนั้น โปรดพิจารณาคำอธิบายของ Regex ด้วย! ไม่ใช่ทุกคนที่ก้าวหน้าพอที่จะรู้ว่าคุณเขียนอะไรที่นั่น ขอบคุณ
Pratik

@PratikCJoshi ฉันหมายถึงกรณีตาย ^ หมายถึงไม่ได้ขึ้นต้นด้วย \ d ตรงกับตัวเลขใด ๆ az จับคู่อักขระทั้งหมดระหว่าง a และ z เนื่องจากพารามิเตอร์ i คุณไม่ต้องระบุ az และ AZ หลังจาก \ d มีช่องว่างจึงอนุญาตให้มีช่องว่างใน regex นี้
บาร์ต

1
ผู้คนไม่ได้อ่านความคิดเห็นว่าเป็นคำตอบ โปรดอัปเดตคำตอบ!
Pratik

18

นี่คือ regex ที่ง่ายมากสำหรับสิ่งนั้น:

\W|_

และใช้ตามที่คุณต้องการ (พร้อม/ตัวคั่นเครื่องหมายสแลช)

preg_replace("/\W|_/", '', $string);

ทดสอบที่นี่ด้วยเครื่องมือที่ยอดเยี่ยมนี้ซึ่งอธิบายว่า regex กำลังทำอะไร:

http://www.regexr.com/


1
คุณยังต้องการ/uแฟล็กมิฉะนั้นตัวอักษรที่ไม่ใช่ ASCII จะถูกลบออกด้วย
Xeoncross

เรียบร้อยแต่จะจับคู่ช่องว่างและหากต้องการสิ่งนี้อาจเป็นไปได้ที่จะเพิ่มประสิทธิภาพเป็นสองเท่าโดยการใช้คลาสตัวละครและปริมาณเพิ่มเติมสำหรับหนึ่งหรือมากกว่านั้น [\W_]+
bobble bubble

18

หากคุณต้องการสนับสนุนภาษาอื่นแทน 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} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界

หมายเหตุ:นี่เป็นคำถามที่เก่ามาก แต่ก็ยังมีความเกี่ยวข้อง ฉันกำลังตอบอย่างหมดจดเพื่อให้ข้อมูลเสริมที่อาจเป็นประโยชน์กับผู้เข้าชมในอนาคต


8
[\W_]+

 

$string = preg_replace("/[\W_]+/u", '', $string);

มันเลือกทั้งหมดที่ไม่ใช่ AZ, az, 0-9 และลบออก

ดูตัวอย่างได้ที่นี่: https://regexr.com/3h1rj


1
regex นี้ / [\ W _] + / u หมายถึงอะไร
Ângelo Rigo

\Wเป็นสิ่งที่ตรงกันข้ามของซึ่งเป็นตัวอักษร\w A-Za-z0-9_ดังนั้น\Wจะจับคู่กับตัวละครที่ไม่ได้A-Za-z0-9_และลบออก []เป็นเขตแดนชุดอักขระ การ+ซ้ำซ้อนบนขอบเขตชุดอักขระ แต่โดยปกติหมายถึง 1 อักขระขึ้นไป uธงขยายการแสดงออกที่จะรวมถึงการสนับสนุนอักขระ Unicode ซึ่งหมายความว่ามันจะไม่ลบอักขระเกิน 255 ª²³µตัวอักษรรหัสเช่น ตัวอย่างของประเพณีต่าง ๆ3v4l.org/hSVV5 ที่มีอักขระ Unicode และ ascii
fyrye


0

ฉันกำลังมองหาคำตอบด้วยและความตั้งใจของฉันคือการทำความสะอาดทุกอย่างที่ไม่ใช่อัลฟาและไม่ควรมีมากกว่าหนึ่งช่องว่าง
ดังนั้นฉันจึงแก้ไขคำตอบของ Alex และสิ่งนี้ใช้ได้ผลสำหรับฉัน preg_replace('/[^a-z|\s+]+/i', ' ', $name)
regex ด้านบนหันsy8ed sirajul7_islamไปเป็นsy ed sirajul islam
คำอธิบาย: regex จะตรวจสอบไม่ได้จาก a ถึง z ในกรณีที่ไม่มีความรู้สึกหรือมากกว่าหนึ่งช่องว่างสีขาวและมันจะถูกแปลงเป็นแบบเดี่ยว ช่องว่าง


-2

คุณสามารถแยกสตริงออกเป็นอักขระและกรองได้

<?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

?>

เหตุผลในการ downvote: 3v4l.org/fqLVZ ฟังก์ชั่นการโทร (3 + N) บนสตริงที่มีความยาวไม่ทราบดูเหมือนจะไม่น่าดึงดูดจริงๆเมื่อเทียบกับการpreg_replace()โทรเพียงครั้งเดียวและเรียบง่าย
mickmackusa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.