ผมมองในกองมากเกิน ( แทนที่ตัวอักษร .. เอ๊ะ , วิธี JavaScript ไม่เป็นไปตามมาตรฐาน Unicode เกี่ยวกับนิพจน์ทั่วไป , ฯลฯ ) และมีไม่ได้จริงๆพบคำตอบที่เป็นรูปธรรมเพื่อคำถาม:
How can JavaScript match for accented characters (those with diacritical marks)?
ฉันบังคับให้ฟิลด์ใน UI จับคู่รูปแบบ: last_name, first_name
(สุดท้าย [คอมม่าสเปซ] ก่อน)และฉันต้องการให้การสนับสนุนนักกำกับเสียง แต่เห็นได้ชัดว่าใน JavaScript มันยากกว่าภาษา / แพลตฟอร์มอื่นเล็กน้อย
นี่เป็นรุ่นดั้งเดิมของฉันจนกว่าฉันจะต้องการเพิ่มการสนับสนุนการออกเสียง:
/^[a-zA-Z]+,\s[a-zA-Z]+$/
ขณะนี้ฉันกำลังถกเถียงกันหนึ่งในสามวิธีในการเพิ่มการสนับสนุนซึ่งทั้งหมดนี้ฉันได้ทดสอบและทำงาน (อย่างน้อยก็ระดับหนึ่งฉันไม่รู้จริงๆว่า "ขอบเขต" เป็นวิธีที่สอง) ที่นี่พวกเขาคือ:
แสดงรายการอักขระเน้นเสียงทั้งหมดที่ฉันต้องการยอมรับว่าใช้ได้อย่างถูกต้อง (อ่อนแอและซับซ้อนเกินไป):
var accentedCharacters = "àèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ";
// Build the full regex
var regex = "^[a-zA-Z" + accentedCharacters + "]+,\\s[a-zA-Z" + accentedCharacters + "]+$";
// Create a RegExp from the string version
regexCompiled = new RegExp(regex);
// regexCompiled = /^[a-zA-ZàèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ]+,\s[a-zA-ZàèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ]+$/
- นี้ได้อย่างถูกต้องตรงกับที่ผ่าน / ชื่อแรกกับใด ๆ
accentedCharacters
ของตัวละครที่เน้นการสนับสนุนใน
วิธีอื่นของฉันคือใช้.
คลาสของตัวละครเพื่อให้แสดงออกได้ง่ายขึ้น:
var regex = /^.+,\s.+$/;
something, something
นี้จะตรงกับเพียงเกี่ยวกับอะไรอย่างน้อยในรูปแบบของ: ไม่เป็นไรฉันคิดว่า ...
วิธีสุดท้ายที่ฉันเพิ่งพบอาจจะง่ายกว่า ...
/^[a-zA-Z\u00C0-\u017F]+,\s[a-zA-Z\u00C0-\u017F]+$/
- มันตรงกับช่วงของอักขระยูนิโค้ด - ผ่านการทดสอบและการทำงานแม้ว่าฉันจะไม่ได้ลองอะไรที่บ้าคลั่ง แต่เป็นเรื่องปกติที่ฉันเห็นในแผนกภาษาของเราสำหรับชื่ออาจารย์
นี่คือความกังวลของฉัน:
- ทางออกแรกคือการ จำกัด ที่มากเกินไปและเลอะเทอะและซับซ้อนที่ มันจะต้องเปลี่ยนถ้าฉันลืมตัวละครหนึ่งหรือสองตัวและนั่นก็ไม่เชิงปฏิบัติ
- วิธีแก้ปัญหาที่สองนั้นดีกว่ากระชับ แต่ก็อาจจะตรงกว่าที่ควรจะเป็น ฉันไม่สามารถหาเอกสารจริงใด ๆ เกี่ยวกับสิ่งที่
.
ตรงกันเพียงแค่ลักษณะทั่วไปของ "ตัวละครใด ๆ ยกเว้นตัวอักษรขึ้นบรรทัดใหม่" (จากตารางในMDN ) วิธีที่สามดูเหมือนจะแม่นยำที่สุด แต่มี gotchas บ้างไหม? ฉันไม่คุ้นเคยกับ Unicode อย่างน้อยในทางปฏิบัติ แต่การดูตารางรหัส / ความต่อเนื่องของตารางนั้น
\u00C0-\u017F
ดูเหมือนจะค่อนข้างแข็งทีเดียวอย่างน้อยก็สำหรับสิ่งที่ฉันคาดหวัง- คณะจะไม่ส่งแบบฟอร์มพร้อมชื่อของพวกเขาเป็นภาษาแม่ (เช่นอาหรับ, จีน, ญี่ปุ่น, ฯลฯ ) ดังนั้นฉันจึงไม่ต้องกังวลเกี่ยวกับตัวละครนอกชุดอักขระละติน
ดังนั้นคำถามจริง : วิธีใดในสามแนวทางนี้ที่เหมาะสมที่สุดสำหรับงาน หรือมีวิธีแก้ปัญหาที่ดีกว่า
regex = /^[^,]+,\s[^,]+$/;
ป้องกันได้