ฉันได้ค้นหาและค้นหาและเล่นและเล่นกับมันและแม้ว่ามันจะไม่สมบูรณ์แบบ แต่ก็อาจช่วยให้ผู้อื่นพยายามตรวจสอบความถูกต้องของชื่อและนามสกุลที่ให้ไว้เป็นตัวแปรเดียว
ในกรณีของฉันตัวแปรนั้นคือ $ name
ฉันใช้รหัสต่อไปนี้สำหรับ PHP ของฉัน:
if (preg_match('/\b([A-Z]{1}[a-z]{1,30}[- ]{0,1}|[A-Z]{1}[- \']{1}[A-Z]{0,1}
[a-z]{1,30}[- ]{0,1}|[a-z]{1,2}[ -\']{1}[A-Z]{1}[a-z]{1,30}){2,5}/', $name)
# there is no space line break between in the above "if statement", any that
# you notice or perceive are only there for formatting purposes.
#
# pass - successful match - do something
} else {
# fail - unsuccessful match - do something
ฉันกำลังเรียนรู้ RegEx ด้วยตนเอง แต่ฉันมีคำอธิบายเกี่ยวกับรหัสตามที่เพื่อน RegEx ให้มา
นี่คือ:
ยืนยันตำแหน่งที่ขอบเขตของคำ« \ b »
จับคู่นิพจน์ทั่วไปด้านล่างและจับคู่นิพจน์ดังกล่าวเป็น backreference หมายเลข 1
« ([AZ] {1} [az] {1,30} [-] {0,1} | [AZ] {1} [- \ '] { 1} [AZ] {0,1} [az] {1,30} [-] {0,1} | [az] {1,2} [- \ '] {1} [AZ] {1} [ az] {1,30}) {2,5} »
ระหว่าง 2 ถึง 5 ครั้งหลาย ๆ ครั้งให้ได้ตามต้องการ (โลภ) « {2,5} »
*ฉันต้องการความช่วยเหลือบางอย่างที่นี่ด้วยการทำความเข้าใจกับความซับซ้อนของหมายเหตุนี้ *
หมายเหตุ: ฉันทำซ้ำกลุ่มการจับภาพเอง กลุ่มจะจับเฉพาะการทำซ้ำครั้งสุดท้าย วางกลุ่มการจับภาพไว้รอบ ๆ กลุ่มที่ทำซ้ำเพื่อจับภาพการวนซ้ำทั้งหมด «{2,5}»
จับคู่นิพจน์ทั่วไปด้านล่างอย่างใดอย่างหนึ่ง (พยายามใช้ทางเลือกถัดไปถ้าอันนี้ล้มเหลวเท่านั้น) « [AZ] {1} [az] {1,30} [-] {0,1} »
จับคู่อักขระเดี่ยวในช่วงระหว่าง“ A” และ“ Z” « [AZ] {1} »
ตรง 1 ครั้ง« {1} »
จับคู่อักขระเดี่ยวในช่วงระหว่าง“ a” และ“ z” « [az] {1,30} »
ระหว่างหนึ่งถึง 30 ครั้งให้มากที่สุดเท่าที่จะเป็นไปได้โดยให้คืนตามต้องการ (โลภ) « {1,30} »
จับคู่อักขระเดี่ยวที่มีอยู่ในรายการ“ -” « [-] {0,1} »
ระหว่างศูนย์ถึงหนึ่งครั้งให้มากที่สุดเท่าที่จะทำได้โดยให้คืนตามต้องการ (โลภ) « {0,1} »
หรือจับคู่นิพจน์ทั่วไปหมายเลข 2 ด้านล่าง (พยายามใช้ทางเลือกถัดไปหากไม่สามารถใช้งานได้) « [AZ] {1} [- \ '] {1} [AZ] {0,1} [az] {1,30} [ -] {0,1} »
จับคู่อักขระเดี่ยวในช่วงระหว่าง“ A” และ“ Z” « [AZ] {1} »
ตรง 1 ครั้ง« {1} »
จับคู่อักขระเดี่ยวที่มีอยู่ในรายการด้านล่าง« [- \ '] {1} »
ตรง 1 ครั้ง« {1} »
หนึ่งในอักขระ“ -” « - » A 'อักขระ« \' »
จับคู่อักขระเดี่ยวในช่วงระหว่าง“ A” และ“ Z” « [AZ] {0,1} »
ระหว่างศูนย์ถึงหนึ่งครั้งให้มากที่สุดเท่าที่จะทำได้โดยให้คืนตามต้องการ (โลภ) « {0,1} »
จับคู่อักขระเดี่ยวในช่วงระหว่าง“ a” และ“ z” « [az] {1,30} »
ระหว่างหนึ่งถึง 30 ครั้งให้มากที่สุดเท่าที่จะเป็นไปได้โดยให้คืนตามต้องการ (โลภ) « {1,30} »
จับคู่อักขระเดี่ยวที่มีอยู่ในรายการ“ -” « [-] {0,1} »
ระหว่างศูนย์ถึงหนึ่งครั้งให้มากที่สุดเท่าที่จะทำได้โดยให้คืนตามต้องการ (โลภ) « {0,1} »
หรือจับคู่นิพจน์ทั่วไปหมายเลข 3 ด้านล่าง (ทั้งกลุ่มจะล้มเหลวหากไม่สามารถจับคู่ได้) « [az] {1,2} [- \ '] {1} [AZ] {1} [az] {1,30} »
จับคู่อักขระเดี่ยวในช่วงระหว่าง“ a” และ“ z” « [az] {1,2} »
ระหว่างหนึ่งถึง 2 ครั้งให้มากที่สุดเท่าที่จะทำได้โดยให้คืนตามต้องการ (โลภ) « {1,2} »
จับคู่อักขระเดี่ยวในช่วงระหว่าง“” และ“ '” « [- \'] {1} »
ตรง 1 ครั้ง« {1} »
จับคู่อักขระเดี่ยวในช่วงระหว่าง“ A” และ“ Z” « [AZ] {1} »
ตรง 1 ครั้ง« {1} »
จับคู่อักขระเดี่ยวในช่วงระหว่าง“ a” และ“ z” « [az] {1,30} »
ระหว่างหนึ่งถึง 30 ครั้งให้มากที่สุดเท่าที่จะเป็นไปได้โดยให้คืนตามต้องการ (โลภ) « {1,30} »
ฉันรู้ว่าการตรวจสอบความถูกต้องนี้ถือว่าทุกคนที่กรอกแบบฟอร์มมีชื่อฝรั่งและนั่นอาจกำจัดคนส่วนใหญ่ในโลกออกไป อย่างไรก็ตามฉันรู้สึกว่านี่เป็นขั้นตอนในทิศทางที่เหมาะสม บางทีนิพจน์ทั่วไปนี้อาจจะธรรมดาเกินไปสำหรับผู้เชี่ยวชาญที่จะพูดง่ายๆหรืออาจมีเหตุผลอื่นที่ทำให้ฉันไม่พบโค้ดด้านบนในการค้นหาของฉัน ฉันใช้เวลานานเกินไปในการพยายามคิดออกคุณอาจสังเกตได้ว่าจิตใจของฉันมีหมอกแค่ไหนถ้าคุณดูชื่อการทดสอบของฉันด้านล่าง
ฉันทดสอบรหัสกับชื่อต่อไปนี้และผลลัพธ์อยู่ในวงเล็บทางด้านขวาของแต่ละชื่อ
- สตีฟสมิ ธ (ล้มเหลว)
- Stev3 Smith (ล้มเหลว)
- สตีฟสมิ ธ (ล้มเหลว)
- Steve SMith (ล้มเหลว)
- Steve Sm1th (ส่งต่อ Steve Sm)
- d'Are to Beaware (ส่งต่อ Are to Beaware)
- Jo Blow (ผ่าน)
- Hyoung Kyoung Wu (ผ่าน)
- Mike O'Neal (ผ่าน)
- Steve Johnson-Smith (ผ่าน)
- Jozef-Schmozev Hiemdel (ผ่าน)
- O Henry Smith (ผ่าน)
- Mathais d'Arras (ผ่าน)
- Martin Luther King Jr (ผ่าน)
- Downtown-James Brown (ผ่าน)
- Darren McCarty (ผ่าน)
- George De FunkMaster (ผ่าน)
- Kurtis B-Ball Basketball (ผ่าน)
- Ahmad el Jeffe (ผ่าน)
หากคุณมีชื่อพื้นฐานต้องมีมากกว่าหนึ่งถึงห้าเพื่อให้โค้ดด้านบนทำงานซึ่งคล้ายกับที่ฉันใช้ในระหว่างการทดสอบรหัสนี้อาจเหมาะสำหรับคุณ
หากคุณมีการปรับปรุงใด ๆ โปรดแจ้งให้เราทราบ ฉันเพิ่งอยู่ในช่วงเริ่มต้น (ไม่กี่เดือนแรกของการหา RegEx
ขอบคุณและโชคดีสตีฟ