ขั้นแรก มาดูอักขระพิเศษสองตัว: '^' และ '$' ใช้เพื่อจับคู่จุดเริ่มต้นและจุดสิ้นสุดของสตริงตามลำดับ นี่คือตัวอย่าง:
"^The": จับคู่อักขระที่ขึ้นต้นด้วย "The" String
" of despair$": จับคู่สตริงที่ลงท้ายด้วย "of despair";
"^abc$": จับคู่สตริงที่ขึ้นต้นด้วย abc และลงท้ายด้วย abc อันที่จริงมีเพียง abc เท่านั้นที่จับคู่มัน
"notice": จับคู่สตริงที่มีการแจ้งเตือน
คุณ จะเห็นว่าถ้าคุณไม่ใช้อักขระสองตัวที่เรากล่าวถึง (ตัวอย่างสุดท้าย) นั่นหมายความว่ารูปแบบ (นิพจน์ทั่วไป) สามารถปรากฏได้ทุกที่ในสตริงที่กำลังตรวจสอบ และคุณไม่ได้ใช้มัน ล็อกด้านข้าง
นอกจากนี้ยังมีอักขระหลายตัว '*', '+' และ '?' ซึ่งใช้แทนจำนวนหรือลำดับการเกิดอักขระตามลำดับ: "0 or more", "one or more" และ
"
ศูนย์หรือหนึ่ง" นี่คือตัวอย่างบางส่วน:
"ab*": จับคู่สตริงที่ประกอบด้วย a และศูนย์หรือมากกว่า b ("a", "ab", "abbb" ฯลฯ );
ข้างต้น แต่มีอย่างน้อยหนึ่ง b ("ab", "abbb" ฯลฯ );
"ab?": จับคู่ 0 หรือหนึ่ง b;
"a?b+$": จับคู่หนึ่งหรือ 0 a ตามด้วยเพิ่มมากกว่าหนึ่ง สตริงที่ลงท้ายด้วย b
คุณยังสามารถจำกัดจำนวนอักขระที่ปรากฏในวงเล็บปีกกาได้ เช่น
"ab{2}": จับคู่ a ตามด้วย b สองตัว (ไม่ต่ำกว่า) ("abb ")
; ": อย่างน้อยสองตัว b("abbb", "abbbb", ฯลฯ.);
"ab{3,5}": 2-5 b("abbb", "abbbb ", หรือ "abbbbb")
คุณต้องยัง โปรดทราบว่าคุณต้องระบุเสมอ (เช่น "{0,2}" ไม่ใช่ "{,2}") ในทำนองเดียวกัน คุณต้องทราบว่า '*', ' +' และ '?' ตามหลังคำอธิบายประกอบสามช่วง "{0,}", "{1,}" และ "{0,1}" ตามลำดับ
ตอนนี้ให้ใส่อักขระจำนวนหนึ่งในวงเล็บ เช่น:
"a(bc)*": จับคู่ตามด้วย 0 หรือหนึ่ง "bc";
"a(bc){1,5}": หนึ่งถึง 5 "bc "
ยังมีอักขระ '│' ซึ่งเทียบเท่ากับการดำเนินการ OR:
"hi│hello": จับคู่สตริงที่มี "hi" หรือ "hello";
"(b│cd)ef": จับคู่สตริงที่มี "bef" หรือสตริงของ "cdef";
"(a│b)*c": จับคู่สตริงที่มี - หลายรายการ (รวมถึง 0) a หรือ b ตามด้วยสตริง c;
จุด ('.' ) สามารถแสดงถึงอักขระเดี่ยวทั้งหมด:
"a.[0-9]": ตามด้วยอักขระตามด้วยตัวเลข (สตริงที่มีสตริงดังกล่าวจะถูกจับคู่ และวงเล็บนี้จะถูกละไว้ในอนาคต)
"^.{ 3}$": สิ้นสุด ด้วยอักขระสามตัว เนื้อหาที่อยู่ในวงเล็บเหลี่ยมจะตรงกับอักขระตัวเดียวเท่านั้น
"[ab]": จับ
คู่อักขระตัวเดียวจาก ' a' ถึง 'd' (เอฟเฟกต์เช่นเดียวกับ "a│b│c│d" และ "[abcd]");
"^[a-zA-Z]": จับคู่อักขระที่ขึ้นต้นด้วยตัวอักษร String
"[0-9 ]%": จับคู่สตริงที่มี x%
, "[a-zA-Z0-9]$": จับคู่สตริงที่ลงท้ายด้วยลูกน้ำตามด้วยตัวเลขหรือตัวอักษร
คุณยังสามารถใส่อักขระที่คุณไม่ต้องการในวงเล็บเหลี่ยมได้อีกด้วย คุณเพียงแค่ต้องใช้ '^' เป็นจุดเริ่มต้นของวงเล็บ (เช่น "%[^a-zA-Z]%" จะจับคู่เครื่องหมายสองเปอร์เซ็นต์โดยมีหนึ่งอันอยู่ข้างใน
เพื่อที่จะสามารถทำได้ ตีความ แต่เมื่อ "^.[$()│*+?{" ถูกใช้เป็นอักขระที่มีความหมายพิเศษ คุณต้องเพิ่ม '' นำหน้าอักขระเหล่านี้ และใน php3 คุณควรหลีกเลี่ยงการใช้ ที่จุดเริ่มต้นของ รูปแบบ ตัวอย่างเช่น นิพจน์ทั่วไป "($│?[0-9]+" ควรเรียกว่า ereg("( \$│?[0-9 ]+", $str) (ฉันไม่ รู้ว่าเหมือนกันใน php4 หรือไม่)
อย่าลืมว่าอักขระในวงเล็บเหลี่ยมเป็นข้อยกเว้นสำหรับกฎนี้ - ภายในวงเล็บเหลี่ยม อักขระพิเศษทั้งหมด รวมถึง ('') จะสูญเสียคุณสมบัติพิเศษ ( เช่น "[* +?{}.]" จะจับคู่สตริงที่มีอักขระเหล่านี้) นอกจากนี้ ตามที่คู่มือ regx บอกเรา: "หากรายการมี ']' จะเป็นการดีที่สุดที่จะใช้เป็นอักขระตัวแรกในรายการอักขระ A (อาจ ติดตาม '^') หากมี '-' ควรวางไว้ที่จุดเริ่มต้นหรือจุดสิ้นสุด หรือหรือที่จุดสิ้นสุดที่สองของช่วง (เช่น [ad-0-9] '-' ใน ตรงกลางจะใช้ได้
เพื่อความสมบูรณ์ ฉันควรครอบคลุมลำดับการเรียง คลาสอักขระ และคลาสที่เทียบเท่า แต่ฉันไม่ต้องการลงรายละเอียดมากเกินไปในแง่มุมเหล่านี้ และสิ่งเหล่านี้ไม่จำเป็นต้องกล่าวถึงใน บทความต่อไปนี้ คุณสามารถดูข้อมูลเพิ่มเติมได้ในหน้าคู่มือ regex
วิธีสร้างรูปแบบเพื่อให้ตรงกับอินพุตของจำนวนสกุลเงิน
ตอนนี้เราจะใช้สิ่งที่เราได้เรียนรู้เพื่อทำสิ่งที่มีประโยชน์: สร้างรูปแบบที่ตรงกันเพื่อตรวจสอบว่า ข้อมูลอินพุตเป็นตัวเลขที่แสดงถึงเงิน เราคิดว่ามีสี่วิธีในการแสดงจำนวนเงิน: "10,000.00" และ "10,000.00" หรือไม่มีทศนิยม คือ "10,000" และ "10,000" ตอนนี้เรามาเริ่มสร้างรูปแบบการจับคู่นี้กัน:
^[1-9][ 0 -9]*$
ซึ่งหมายความว่าตัวแปรทั้งหมดต้องขึ้นต้นด้วยตัวเลขอื่นที่ไม่ใช่ 0 แต่ก็หมายความว่า "0" ตัวเดียวไม่สามารถผ่านการทดสอบได้ ต่อไปนี้คือวิธีแก้ปัญหา:
^(0│[1-9] [0- 9]*)$
"เฉพาะ 0 และตัวเลขที่เริ่มต้นด้วย 0 ที่ตรงกัน" เรายังอนุญาตให้มีเครื่องหมายลบหน้าตัวเลขได้อีกด้วย:
^(0│-?[1-9][0-9]*)$
This คือ: "0 หรือตัวเลขที่ขึ้นต้นด้วย 0 ที่อาจมีเครื่องหมายลบอยู่ข้างหน้า" โอเค เอาล่ะ เข้มงวดน้อยลงแล้วอนุญาตให้เริ่มต้นด้วย 0 ทีนี้ลองทิ้งเครื่องหมายลบเพราะเราเป็นตัวแทนของเหรียญที่นั่น ไม่จำเป็นต้องใช้มัน ตอนนี้เราระบุรูปแบบให้ตรงกับส่วนทศนิยม:
^[0-9]+(.[0-9]+)?$
ซึ่งหมายความว่าสตริงที่ตรงกันจะต้องเริ่มต้นด้วยภาษาอาหรับอย่างน้อยหนึ่งตัว หลัก แต่โปรดทราบว่า "10" ไม่ตรงกันในรูปแบบด้านบน มีเพียง "10" และ "10.2" เท่านั้นที่สามารถทำได้ (คุณรู้ไหมว่าทำไม)
^[0-9]+(.[0-9]{ 2 })?$
เราระบุไว้ข้างต้นว่าจะต้องมีทศนิยมสองตำแหน่งหลังจุดทศนิยม หากคุณคิดว่ามันรุนแรงเกินไป คุณสามารถเปลี่ยนเป็น:
^[0-9]+(.[0-9]{1 ,2})? $
ซึ่งจะอนุญาตให้มีอักขระหนึ่งหรือสองตัวหลังจุดทศนิยม ตอนนี้เราเพิ่มเครื่องหมายจุลภาคเพื่อให้อ่านง่าย (ทุกๆ หลักที่สาม) เราก็สามารถแสดงได้ดังนี้:
^[0-9]{1,3}( ,[ 0-9]{3})*(.[0-9]{1,2})?$
อย่าลืมเครื่องหมายบวก '+' ซึ่งสามารถแทนที่ด้วยเครื่องหมายคูณ '*' หากคุณ ต้องการอนุญาตให้ป้อนสตริงว่าง (ทำไม?) และอย่าลืมว่าเครื่องหมายแบ็กสแลช '' อาจทำให้เกิดข้อผิดพลาดในสตริง PHP ได้ (ซึ่งเป็นข้อผิดพลาดที่พบบ่อยมาก) ตอนนี้เราสามารถยืนยันสตริงได้แล้ว เราจะลบทั้งหมด เครื่องหมายจุลภาค str_replace(" ,", "", $money) จากนั้นให้ถือว่าประเภทนั้นเป็นสองเท่าและเราจะสามารถคำนวณทางคณิตศาสตร์ผ่านมันได้
การสร้างนิพจน์ทั่วไปสำหรับการตรวจสอบอีเมล
ให้เราหารือเกี่ยวกับวิธีการยืนยันที่อยู่อีเมลต่อไปอย่างครบถ้วน ที่อยู่อีเมล มีสามส่วน: ชื่อผู้ใช้ POP3 (ทุกส่วนทางด้านซ้ายของ '@' ), '@' , ชื่อเซิร์ฟเวอร์ (นั่นคือส่วนที่เหลือ) ชื่อผู้ใช้สามารถประกอบด้วยตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก, เลขอารบิค, จุด ('. ') ลบ ('-') และขีดล่าง ('_') ชื่อเซิร์ฟเวอร์ก็เป็นไปตามกฎนี้เช่นกัน ยกเว้นเครื่องหมายขีดล่าง
ขณะนี้ ชื่อผู้ใช้ไม่สามารถขึ้นต้นหรือลงท้ายด้วยจุดได้เช่นเดียวกัน ต้องมีอักขระอย่างน้อยหนึ่งตัวระหว่างจุดต่อเนื่องกัน ตอนนี้ มาดูวิธีเขียนรูปแบบการจับคู่สำหรับชื่อผู้ใช้กัน:
^[_a-zA-Z0-9-]+$
การมีอยู่ของจุดคือ ยังไม่ได้รับอนุญาต มาเพิ่ม:
^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*$
ความหมายข้างต้น: "เริ่มต้นด้วยอักขระมาตรฐานอย่างน้อยหนึ่งตัว (ยกเว้น . โดยไม่ได้ตั้งใจ) ตามด้วยสตริง 0 หรือมากกว่านั้นโดยขึ้นต้นด้วยจุด "
เพื่อให้ง่ายขึ้น เราสามารถใช้ eregi() แทน ereg() eregi() ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ ดังนั้นเราจึงไม่จำเป็นต้องระบุ สองช่วง" az " และ "AZ" - คุณจะต้องระบุเพียงช่วงเดียวเท่านั้น:
^[_a-z0-9-]+(.[_a-z0-9-]+)*$
ชื่อเซิร์ฟเวอร์หลังจากนั้นเหมือนกัน แต่จะต้องลบเครื่องหมายขีดล่างออก :
^[a-z0-9-]+(.[a-z0-9-]+)*$
เสร็จสิ้น ตอนนี้เพียงใช้ "@" เพื่อเชื่อมต่อทั้งสองส่วน:
^[_a -z0-9-]+ (.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*$
นี่คือที่สมบูรณ์ โหมดจับคู่การตรวจสอบสิทธิ์อีเมล ต้องโทรไป
ที่ eregi('^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[ a-z0-9-] +)*$ ',$eamil)
เพื่อดูว่าเป็นอีเมลหรือไม่
การใช้งานนิพจน์ทั่วไปอื่นๆ
เพื่อแยกสตริง
ereg() และ eregi() มีคุณลักษณะที่ช่วยให้ผู้ใช้สามารถแยกส่วนของสตริงผ่านนิพจน์ทั่วไป (คุณสามารถอ่านคู่มือสำหรับการใช้งานเฉพาะได้ ตัวอย่างเช่น เราต้องการแยกส่วนหนึ่งของ สตริงจากชื่อไฟล์แยกพาธ/URL – โค้ดต่อไปนี้คือสิ่งที่คุณต้องการ:
ereg("([^\/]*)$", $pathOrUrl, $regs);
echo $regs[1];
การทดแทนขั้นสูง
ereg_replace() และ eregi_replace() ก็มีประโยชน์เช่นกัน: หากเราต้องการแทนที่เครื่องหมายลบที่แยกกันทั้งหมดด้วยเครื่องหมายจุลภาค:
ereg_replace("[ nrt]+" , "," , ตัด($str));