จับคู่ช่องว่างใน regex


229

ฉันต้องการจับคู่อักขระช่องว่างในนิพจน์ปกติของ PHP ใครมีความคิดเห็นบ้าง

ฉันหมายถึงเหมือน "gavin schulz" ช่องว่างระหว่างคำทั้งสอง ฉันใช้การแสดงออกปกติเพื่อให้แน่ใจว่าฉันอนุญาตเฉพาะตัวอักษรตัวเลขและช่องว่าง แต่ฉันไม่แน่ใจว่าจะหาพื้นที่ได้อย่างไร นี่คือสิ่งที่ฉันมีตอนนี้:

$newtag = preg_replace("/[^a-zA-Z0-9s|]/", "", $tag);

2
อืม ... ยังไม่มีคำถามเกี่ยวกับการจับคู่ 'a' หรือ 'b' ... ;)

1
คุณควรเห็นตัวอย่าง regex
T.Todua

คำตอบ:


368

หากคุณกำลังมองหาที่ว่างนั่นก็คือ" "(หนึ่งช่องว่าง)

หากคุณกำลังมองหาหนึ่งหรือมากกว่านั้นก็คือ" *"(นั่นคือสองช่องว่างและเครื่องหมายดอกจัน) หรือ" +"(หนึ่งช่องว่างและเครื่องหมายบวก)

หากคุณกำลังมองหาช่องว่างทั่วไปให้ใช้"[ X]"หรือ"[ X][ X]*"หรือ"[ X]+"ที่Xตัวละครแท็บทางกายภาพ (และแต่ละคนจะนำหน้าด้วยช่องว่างเดียวในตัวอย่างเหล่านั้นทั้งหมด)

สิ่งเหล่านี้จะใช้ได้กับเอ็นจิ้น * regex ทุกตัวที่ฉันเคยเห็น (บางอันไม่มีแม้แต่"+"ตัวละครหนึ่งตัวหรือมากกว่า)

หากคุณรู้ว่าคุณกำลังใช้หนึ่งในเครื่องมือ regex ที่ทันสมัยกว่า"\s"และรูปแบบต่าง ๆ เป็นวิธีที่จะไป นอกจากนี้ฉันเชื่อว่าขอบเขตของคำตรงกับจุดเริ่มต้นและจุดสิ้นสุดของบรรทัดเช่นกันสิ่งสำคัญเมื่อคุณกำลังมองหาคำที่อาจปรากฏขึ้นโดยไม่ต้องเว้นวรรคก่อนหรือตามหลัง

สำหรับ PHP โดยเฉพาะหน้านี้อาจช่วยได้

จากการแก้ไขของคุณดูเหมือนว่าคุณต้องการลบอักขระที่ไม่ถูกต้องทั้งหมดจุดเริ่มต้นของสิ่งนี้คือ (สังเกตพื้นที่ภายใน regex):

$newtag = preg_replace ("/[^a-zA-Z0-9 ]/", "", $tag);
#                                    ^ space here

หากคุณต้องการใช้กลอุบายเพื่อให้แน่ใจว่ามีเพียงช่องว่างระหว่างแต่ละคำกับไม่มีในตอนเริ่มต้นและสิ้นสุดนั่นเป็นเรื่องที่ซับซ้อนกว่าเล็กน้อย (และอาจเป็นคำถามอื่น) แต่แนวคิดพื้นฐานน่าจะเป็น:

$newtag = preg_replace ("/ +/", " ", $tag); # convert all multispaces to space
$newtag = preg_replace ("/^ /", "", $tag);  # remove space from start
$newtag = preg_replace ("/ $/", "", $tag);  # and end

regex ดั้งเดิมของเขาดูเหมือนจะต้องการแทนที่อักขระ "" คุณกำลังปฏิเสธพื้นที่ดังนั้นพื้นที่ของเขาจะไม่ "ถูกลบ" ตามที่ตั้งใจ
Suroot

การอ้างอิง: "อนุญาตเฉพาะตัวอักษรตัวเลขและช่องว่าง" RE ดั้งเดิมของ Gavin นั้นผิด (ซึ่งเป็นสาเหตุที่เขาถามคำถาม) RE ของฉันลบทุกอย่างที่ไม่ใช่หนึ่งในนั้น
paxdiablo

ทำไมพื้นที่ต้องอยู่ที่ส่วนท้ายของรูปแบบการแข่งขันแทนที่จะพูดตรงกลาง
วอร์เรน

1
@warren มันไม่ ความคิดเห็นที่ 'พื้นที่ที่นี่' ไม่ได้ระบุที่พื้นที่ก็ค่อนข้างจะได้รับการระบุว่ามีพื้นที่มี (ในกรณีที่ผู้อ่านไม่ได้ตระหนักถึง)
paxdiablo

@ ไมค์ไม่นั่นไม่ใช่กรณี เจตนาที่นี่คือการแทนที่ตัวอักษรทั้งหมดที่ไม่ได้A-Za-z...อยู่ในชุด เครื่องหมายรูปหมวกในวงเล็บเหลี่ยมบอกว่า การย้ายเครื่องหมายรูปหมวกที่อยู่ด้านนอกวงเล็บเหลี่ยมจะเปลี่ยนความหมายของอักขระที่ตรงกันในชุดที่จุดเริ่มต้นของสตริง
paxdiablo


34

นี่คือทุกสิ่งที่คุณต้องรู้เกี่ยวกับช่องว่างในการแสดงออกปกติ:

  • [[:blank:]] เว้นวรรคหรือแท็บเท่านั้น
  • [[:space:]] ช่องว่าง
  • \s อักขระช่องว่างใด ๆ
  • \v ช่องว่างในแนวตั้ง
  • \h ช่องว่างแนวนอน
  • x ละเว้นช่องว่าง

5

ดูเหมือนว่าฉันชอบใช้ REGEX ในกรณีนี้จะเป็น overkill ทำไมไม่เพียงแค่strposเพื่อหาอักขระช่องว่าง นอกจากนี้ยังไม่มีอะไรพิเศษเกี่ยวกับอักขระเว้นวรรคในนิพจน์ทั่วไปคุณควรจะสามารถค้นหาได้เช่นเดียวกับที่คุณค้นหาอักขระอื่น ๆ นั่นคือถ้าคุณปิดการใช้งานรูปแบบช่องว่างซึ่งแทบจะไม่จำเป็นในกรณีนี้


5

ใน Perl สวิตช์คือ\s(ช่องว่าง)


16
สิ่งนี้ไม่ถูกต้อง - มันรวบรวมช่องว่างทั้งหมดไม่ใช่แค่อักขระเว้นวรรค
เจเทย์เลอร์

แต่คำถามถูกติดแท็กด้วย PHP ไม่ใช่ Perl
ปีเตอร์มอร์เทนเซ่น

4

ฉันใช้ regex เพื่อให้แน่ใจว่าฉันอนุญาตเฉพาะตัวอักษรตัวเลขและช่องว่างเท่านั้น

จากนั้นมันง่ายพอ ๆ กับการเพิ่มช่องว่างในสิ่งที่คุณมีอยู่แล้ว:

$newtag = preg_replace("/[^a-zA-Z0-9 ]/", "", $tag);

(หมายเหตุฉันลบสิ่งs|ที่ดูเหมือนโดยไม่ได้ตั้งใจหรือไม่แน่นอนsคือซ้ำซ้อนคุณสามารถคืนค่าได้|หากคุณต้องการ)

หากคุณต้องการ * a * space โดยเฉพาะในหนึ่งเดียวคุณจะต้องมีนิพจน์ที่ซับซ้อนกว่านี้และอาจต้องการพิจารณาตรรกะที่ไม่ใช่ regex แยกต่างหาก


3

คุณยังสามารถใช้ \ b สำหรับขอบเขตของคำ สำหรับชื่อฉันจะใช้สิ่งนี้:

[^\b]+\b[^\b]+(\b|$)

แก้ไขการแก้ไขนี้เป็น regex ในตัวอย่าง Perl

if( $fullname =~ /([^\b]+)\b[^\b]+([^\b]+)(\b|$)/ ) {
 $first_name = $1;
 $last_name = $2;
}

แก้ไขอีกครั้งตามสิ่งที่คุณต้องการ:

$new_tag = preg_replace("/[\s\t]/","",$tag);

1

ฉันลอง [[: space:]] ในตัวอย่างที่ดูเหมือนว่าบล็อกเกอร์ใน WordPress กำลังใช้อักขระช่องว่างที่ไม่ได้มาตรฐาน ดูเหมือนว่ามันจะทำงาน


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.