สตริงการค้นหา PHP นิพจน์ทั่วไป นิพจน์ทั่วไปใน php.ini เปลี่ยนการจัดรูปแบบวันที่

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

รู้เบื้องต้นเกี่ยวกับนิพจน์ทั่วไป

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

ฟังก์ชั่นสำหรับการทำงานกับนิพจน์ทั่วไปใน PHP

การยืนยันโดเมน

กำลังตรวจสอบชื่อโดเมนที่ถูกต้อง

$url = "http://example.com/"; if (preg_match("/^(http|https|ftp)://(*(?:.*)+):?(d+)?/?/i", $url)) ( echo "ตกลง"; ) อื่น ๆ ( echo "URL ผิด"; )

การเน้นคำในข้อความ

นิพจน์ทั่วไปที่มีประโยชน์มากสำหรับ . มีประโยชน์ในการค้นหา

$text = "ประโยคตัวอย่าง regex ได้รับความนิยมในการเขียนโปรแกรมเว็บ ตอนนี้เราเรียนรู้ regex ตามวิกิพีเดีย นิพจน์ทั่วไป (ตัวย่อว่า regex หรือ regexp โดยมีรูปแบบพหูพจน์ regexes, regexps หรือ regexen) เขียนด้วยภาษาทางการที่ สามารถตีความได้โดยตัวประมวลผลนิพจน์ทั่วไป"; $text = preg_replace("/b(regex)b/i", " 1", $ข้อความ); เสียงสะท้อน $ข้อความ;

ผลการค้นหาที่เน้นใน WordPress

ตามที่ได้กล่าวไปแล้ว ตัวอย่างก่อนหน้านี้มีประโยชน์มากสำหรับ . มานำไปใช้กับ WordPress กันเถอะ เปิดไฟล์ ค้นหา.php,ค้นหาฟังก์ชัน the_title()แทนที่ด้วยสิ่งต่อไปนี้:

เสียงสะท้อน $title;

ก่อนบรรทัดนี้ ให้ใส่โค้ด:

\0", $title); ?>

เปิดไฟล์ สไตล์.css- เพิ่มบรรทัดเข้าไป:

Strong.search-ข้อความที่ตัดตอนมา ( พื้นหลัง: สีเหลือง; )

รับภาพทั้งหมดจากเอกสาร HTML

หากคุณต้องการค้นหารูปภาพทั้งหมดในหน้า HTML โค้ดต่อไปนี้จะมีประโยชน์มาก ด้วยเครื่องมือนี้ คุณสามารถสร้างโปรแกรมอัพโหลดรูปภาพได้อย่างง่ายดายโดยใช้ไฟล์ .

$images = array(); preg_match_all("/(img|src)=("|")[^"">]+/i", $data, $media); ไม่ได้ตั้งค่า($ข้อมูล); $data=preg_replace("/(img|src)("|"|="|=")(.*)/i","$3",$media); foreach($data as $url) ( $info = pathinfo($url); if (isset($info["extension"])) ( if (($info["extension"] == "jpg") || ($ข้อมูล["ส่วนขยาย"] == "jpeg") ||. ($ข้อมูล ["ส่วนขยาย"] == "gif") ||. ($ข้อมูล ["ส่วนขยาย"] == "png")) array_push($ รูปภาพ, $url);

การลบคำที่ซ้ำกัน (ไม่ขึ้นกับตัวพิมพ์เล็กและใหญ่)

$text = preg_replace("/s(w+s)1/i", "$1", $text);

การลบเครื่องหมายวรรคตอนที่ซ้ำกัน

คล้ายกับอันก่อนหน้า แต่ลบเครื่องหมายวรรคตอนออก

$text = preg_replace("/.+/i", ".", $text);

ค้นหาแท็ก XML/HTML

ฟังก์ชันง่ายๆ ที่รับสองอาร์กิวเมนต์: แท็กที่จะพบและสตริงที่มี XML หรือ HTML

ฟังก์ชั่น get_tag($tag, $xml) ( $tag = preg_quote($tag); preg_match_all("(<".$tag."[^>]*>(.*?)")", $xml, $matches, PREG_PATTERN_ORDER);

ส่งคืนการแข่งขัน $;

ค้นหาแท็ก XML/HTML ที่มีค่าแอตทริบิวต์เฉพาะ

.

ฟังก์ชันนี้คล้ายกับฟังก์ชันก่อนหน้า แต่สามารถระบุแอตทริบิวต์ของแท็กได้ ตัวอย่างเช่น:<(".$tag.")[^>ฟังก์ชั่น get_tag($attr, $value, $xml, $tag=null) ( if(is_null($tag)) $tag = "\w+"; else $tag = preg_quote($tag); $attr = preg_quote($ attr); $value = preg_quote($value); $tag_regex = "/<\/\\1>]*$attr\s*=\s*". "(["\"])$value\\2[^>]*>(.*?)

/" preg_match_all($tag_regex, $xml, $matches, PREG_PATTERN_ORDER); ส่งคืน $matches; )

ค้นหารหัสสี Hex

ฟังก์ชั่นนี้ช่วยให้คุณค้นหาหรือตรวจสอบความถูกต้องของรหัสสีเลขฐานสิบหก

$string = "#555555"; if (preg_match("/^#(?:(?:(3))(1,2))$/i", $string)) ( echo "ตัวอย่าง 6 สำเร็จ"; )

การค้นหาชื่อหน้า </i>รหัสนี้จะค้นหาและแสดงข้อความระหว่างแท็ก <i> และ

หน้า HTML (.*)$fp = fopen("http://www.catswhocode.com/blog","r"); ในขณะที่ (!feof($fp))( $page .= fgets($fp, 4096); ) $titre = eregi("

",$หน้า,$regs); echo $regs; fclose($fp);

กำลังแยกวิเคราะห์บันทึก Apache

เว็บไซต์หลายแห่งทำงานบนเว็บเซิร์ฟเวอร์ Apache หากไซต์ของคุณทำงานบนเซิร์ฟเวอร์ทาโก้ กิจวัตรประจำวันต่อไปนี้อาจเป็นประโยชน์

//บันทึก: เว็บเซิร์ฟเวอร์ Apache // เข้าถึงไฟล์ html ได้สำเร็จ มีประโยชน์สำหรับการนับการแสดงผลหน้าเว็บ "^((?#IP ไคลเอนต์หรือชื่อโดเมน)S+)s+((?#การรับรองความถูกต้องขั้นพื้นฐาน)S+s+S+)s+[((?#วันที่และเวลา)[^]]+)]s+"(?: GET|POST|HEAD) ((?#file)/[^ ?]+?.html?)??((?#parameters)[^ ?]+)? HTTP/+"s+(?#รหัสสถานะ)200s+((?#bytes ถ่ายโอน)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#user agent )[^"]*)"$" //บันทึก: เว็บเซิร์ฟเวอร์ Apache //404 ข้อผิดพลาด "^((?#client IP หรือชื่อโดเมน)S+)s+((?#การตรวจสอบสิทธิ์พื้นฐาน)S+s+S+)s+ [((?#วันที่และเวลา)[^]]+)]s+"(?:GET|POST|HEAD) ((?#file)[^ ?]+)??((?#parameters)[^ ? "]+)? HTTP/+"s+(?#รหัสสถานะ)404s+((?#bytes ถ่ายโอน)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#user agent )[^"]*)"$")

การแทนที่เครื่องหมายคำพูดคู่ด้วยเครื่องหมายคำพูดแบบหยิก

preg_replace("B"b([^"x84x93x94rn]+)b"B", "?1?", $text);

นิพจน์ทั่วไปนี้จะตรวจสอบสตริงทีละจุด: สตริงต้องมีตัวอักษร ตัวเลข ขีดล่าง และขีดกลางอย่างน้อย 6 ตัว บรรทัดจะต้องมีอักษรตัวพิมพ์ใหญ่ ตัวพิมพ์เล็ก และตัวเลขอย่างน้อยหนึ่งตัว

"A(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*?) [-_a-zA-Z0-9](6,)z"

WordPress: การรับภาพโพสต์โดยใช้นิพจน์ทั่วไป

หากคุณใช้ WordPress คุณอาจพบว่าการมีฟีเจอร์ที่จะดึงรูปภาพทั้งหมดจากโพสต์มาแสดงนั้นมีประโยชน์ หากต้องการใช้โค้ดนี้ ให้คัดลอกลงในไฟล์ธีมของคุณ

post_content; $szSearchPattern = "~ ]* />~"; // เรียกใช้ preg_match_all เพื่อดึงภาพทั้งหมดและบันทึกผลลัพธ์ใน $aPics preg_match_all($szSearchPattern, $szPostContent, $aPics); // ตรวจสอบว่าเรามีรูปภาพอย่างน้อย 1 ภาพหรือไม่ $iNumberOfPics = count($aPics); if ($iNumberOfPics > 0) ( // ทีนี้ คุณจะทำทุกอย่างที่ต้องทำกับรูปภาพ // สำหรับตัวอย่างนี้ รูปภาพจะถูกแสดงเพียง ($i=0; $i< $iNumberOfPics ; $i++) { echo $aPics[$i]; }; }; endwhile; endif; ?>

การแปลงอีโมติคอนเป็นรูปภาพ

คุณลักษณะนี้ยังมีอยู่ใน WordPress ซึ่งช่วยให้คุณสามารถแทนที่อิโมติคอนข้อความด้วยรูปภาพได้โดยอัตโนมัติ

$texte="ข้อความที่มีสไมลี่:-)"; เสียงสะท้อน str_replace(":-)" ",$ข้อความ);

เรามาเริ่มกันด้วยว่านิพจน์ทั่วไปคืออะไร ดังนั้นตอบคำถามนี้กับฉัน: มี "e" ในคำว่า "ทดสอบ" หรือไม่? "กิน!" คุณพูด ถ้าอย่างนั้น ฉันถามคำถามที่สองกับคุณ คุณพบตัวอักษร "e" ในคำว่า "ทดสอบ" ได้อย่างไร? คำตอบนั้นชัดเจน เราใช้อักขระตัวแรกนั่นคือ "t" แล้วเปรียบเทียบกับสิ่งที่เรากำลังมองหานั่นคือด้วย "e" หากไม่เท่ากันเราจะนำอักขระตัวที่สองซึ่งก็คือ "e" และเปรียบเทียบกับสิ่งที่เรากำลังมองหานั่นคือ "e" เอาล่ะ! พบการแข่งขัน คำตอบ: คำว่า "ทดสอบ" มีตัวอักษร "e".

ทีนี้ ตอบฉันอีกหนึ่งคำถาม นิพจน์ทั่วไปในตัวอย่างนี้อยู่ที่ไหน? ฉันหวังว่าคุณจะเดาได้ว่านิพจน์ทั่วไปที่นี่คือสิ่งที่เรากำลังมองหาในคำว่า "ทดสอบ" นั่นคือตัวอักษร "e" ในตัวอย่างนี้เป็นนิพจน์ทั่วไป

นิพจน์ทั่วไปใช้ใน PHP คืออะไร? ในทางปฏิบัติของฉัน มีการใช้นิพจน์ทั่วไปเพื่อพิจารณาว่าที่อยู่อีเมลถูกสร้างขึ้นอย่างถูกต้องหรือไม่ สำนวนดังกล่าวยังใช้เพื่อกำหนดความถูกต้องของชื่อผู้ใช้และรหัสผ่าน เมื่อใช้นิพจน์ทั่วไป คุณสามารถค้นหาที่อยู่ในลิงก์และบันทึกได้ มีหลายสิ่งที่คุณสามารถทำได้ ด้วยการวิเคราะห์สิ่งนี้ คุณสามารถระบุฟังก์ชันหลักของนิพจน์ทั่วไปและฟังก์ชันสองด้านได้ ฟังก์ชั่นหลักนี่คือการค้นหารายการที่ตรงกันในสตริง ผลข้างเคียงรวมถึงการบันทึกการแข่งขันที่พบและแทนที่

การแสดงออกปกติครั้งแรก

ตามทฤษฎีแล้ว เราเข้าใจวิธีการค้นหาอักขระ "e" ในคำว่า "ทดสอบ" แต่จะนำไปใช้ในทางปฏิบัติได้อย่างไร หากต้องการใช้นิพจน์ทั่วไปใน php โดยปกติจะใช้ฟังก์ชันต่อไปนี้:

preg_match("นิพจน์ปกติ (รูปแบบ)", "ตัวแปรที่ใช้ค้นหา", "ตัวแปรที่บันทึกผลการค้นหา (พารามิเตอร์ทางเลือก)"); - ฟังก์ชั่นการจับคู่
preg_replace("นิพจน์ทั่วไป (รูปแบบ)", "สิ่งที่จะแทนที่การจับคู่ที่พบด้วย", "ตัวแปรที่ใช้ในการแทนที่"); - แทนที่ฟังก์ชัน

เรามาเริ่มใช้ฟังก์ชันเหล่านี้กันดีกว่า นี่คือตัวอย่างการค้นหาอักขระ "e" ในคำว่า "test":

$a = "ทดสอบ";
if(preg_match("/e/",$a)) echo "พบ!!";

โค้ดอธิบายเงื่อนไข: หากพบสิ่งที่ตรงกับรูปแบบในตัวแปร $a ให้แสดงข้อความ “found!!” ดังที่คุณอาจสังเกตเห็นแล้ว เทมเพลตของเราตั้งอยู่ระหว่าง "/" สองอัน ในกรณีนี้คือสัญลักษณ์ "/" เป็นสัญลักษณ์ของจุดเริ่มต้นและจุดสิ้นสุดของรูปแบบของเรา- ฉันหวังว่านี่จะชัดเจน

แน่นอนว่าทั้งหมดนี้น่าสนใจ... แต่เทมเพลตของเรานั้นเรียบง่ายมาก คุณว่ามั้ย? ท้ายที่สุดแล้ว เราแทบไม่ต้องค้นหาสัญลักษณ์บางตัวในตัวแปรเลย ในกรณีส่วนใหญ่ เราจำเป็นต้องค้นหาตัวละครหลายตัวและตัวละครที่ไม่รู้จักด้วย เป็นไปได้ยังไง? เรามาตั้งปัญหากับตัวเองและพยายามแก้ไขมัน สมมติว่าเรามีสตริงที่ประกอบด้วยตัวเลขและตัวอักษรภาษาอังกฤษตัวหนึ่งที่ไม่รู้จัก

จะหาจดหมายฉบับนี้ได้อย่างไร? อาจมีตัวอักษรภาษาอังกฤษอยู่ด้วย คุณจะระบุได้อย่างไร? คุณตอบคำถามของคุณเองมีตัวอักษรใด ๆ นั่นคืออยู่ในช่วงตั้งแต่ a ถึง z คุณสามารถใช้ช่วงในนิพจน์ทั่วไปได้ หากเราไม่รู้ว่าเรากำลังมองหาตัวละครตัวไหน แต่เรารู้แน่ว่าตัวละครตัวนี้เป็นตัวอักษรภาษาอังกฤษ รายการจะเป็นดังนี้:

$a = "123a321";
if(preg_match("//",$a)) echo "พบ!!";

โปรดทราบว่าช่วงจะอยู่ในวงเล็บ "[" "]" ทุกสิ่งที่อยู่ในวงเล็บดังกล่าวถูกกำหนดให้เป็น หนึ่งสัญลักษณ์ ในกรณีนี้ สัญลักษณ์มีตั้งแต่ a ถึง z หากเราจำเป็นต้องค้นหาไม่ใช่ตัวอักษร แต่เป็นตัวเลข รายการจะเป็นดังนี้:

$a = "abc1cba";
if(preg_match("//",$a)) echo "พบ!!";

ฉันยังต้องการทราบด้วยว่านิพจน์ทั่วไปคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ดังนั้นอักขระ "A" และ "a" จึงแตกต่างกันโดยสิ้นเชิง หากต้องการค้นหาอักขระทั้งสองให้เขียนดังนี้:

$a = "123a321";
if(preg_match("//",$a)) echo "พบ!!";

นอกจากนี้ยังมีการค้นหาตัวอักษรรัสเซียซึ่งดำเนินการในลักษณะเดียวกับตัวอักษรภาษาอังกฤษ:

$a = "123×321";
if(preg_match("/[a-zA-Z]/",$a)) echo "พบ!!";

Metaตัวละคร

เราเรียนรู้วิธีค้นหาอักขระที่ไม่รู้จักในสตริง จะทำอย่างไรถ้าเราต้องหาตัวละครหลายตัว? สิ่งที่เรียกว่าเมตาสัญลักษณ์มาช่วย... สมมติว่าเรามีสตริงที่มีตัวเลขและตัวอักษร เราจะอธิบายในเทมเพลตได้อย่างไร? คุณสามารถทำได้:

บรรทัด - 123a321
ตัวอย่าง -

อืม... เทมเพลตตรงกับสตริงของเราจริงๆ และเมื่อตรวจสอบการปฏิบัติตามข้อกำหนดแล้ว ก็จะถือว่าเป็นจริงที่รอคอยมานาน! แต่มันเป็นอัลบั้มที่ค่อนข้างยุ่งยากนะคุณว่าไหม?

วิธีย่อให้สั้นลงมีดังนี้

บรรทัด - 123a321
ตัวอย่าง - *

สำหรับฉันดูเหมือนว่ามันสั้นกว่า สัญลักษณ์ “*” คืออะไร? นี่เป็นสัญลักษณ์เมตาเดียวกัน หมายความว่าสัญลักษณ์ที่เราอธิบายไว้ (กล่าวคือ สัญลักษณ์ที่สามารถมีตัวเลขตั้งแต่ 0 ถึง 9 หรือตัวอักษรภาษาอังกฤษตั้งแต่ a ถึง z) สามารถทำซ้ำได้อย่างไม่มีกำหนด หรือมากกว่าหนึ่งครั้ง ใช่แล้ว! สัญลักษณ์เมตานี้จะค้นหาการจับคู่ในตัวแปรว่าง เนื่องจากแม้ไม่มีสัญลักษณ์ที่เราอธิบายไว้ก็จะคืนค่าเป็นจริง! จำสิ่งนี้ไว้

มีอักขระเมตาอื่นใดอีกบ้าง?

ตัวอย่างเช่น เมตาอักขระ "+" เกือบจะคล้ายกับเมตาอักขระ "*" โดยมีข้อยกเว้นเล็กๆ น้อยๆ ประการหนึ่ง "*" จะคืนค่าเป็นจริงแม้ว่าจะไม่มีอักขระก็ตาม และ "+" จะตรวจสอบว่ามีอักขระอย่างน้อยหนึ่งตัวหรือไม่ นั่นคือถ้าบรรทัดจำเป็นต้องมีการแสดงตน ขั้นต่ำอักขระหนึ่งตัวจากนั้นใช้ "+" แทน "*"

อักขระเมตา "?" ก็มักใช้เช่นกัน หมายความว่าบรรทัดจะต้องมีอักขระที่ต้องการไม่เกินหนึ่งตัว ฉันขอยกตัวอย่างสองสามตัวอย่างสำหรับอักขระเมตาสองตัวสุดท้ายที่ฉันอธิบาย

สมมติว่าเราต้องตรวจสอบรหัสผ่านของผู้ใช้เพื่อความถูกต้อง ลองคิดดูว่ารหัสผ่านผู้ใช้ควรมีอะไรบ้าง? ก่อนอื่นจะต้องมีอักขระอย่างน้อยหนึ่งตัว ประการที่สอง จะต้องประกอบด้วยตัวเลขและตัวอักษรภาษาอังกฤษเท่านั้น ดังนั้นนิพจน์ทั่วไปจะมีลักษณะดังนี้:

$a = "qwerty12345";

เราอนุญาตให้มีอักขระอะไรบ้าง ตัวอักษรภาษาอังกฤษทุกกรณีและตัวเลข ตอนนี้ให้ลองเว้นบรรทัดว่างแทนรหัสผ่าน

$a = "";
if(preg_match("/+/",$a)) echo "รหัสผ่านถูกต้อง";

คุณจะไม่เห็นข้อความ "รหัสผ่านถูกต้อง" ทำไม เนื่องจากอักขระเมตา "+" ตรวจสอบสตริงเพื่อดูว่ามีอักขระอย่างน้อยหนึ่งตัวหรือไม่

ทีนี้เคล็ดลับเล็กๆ น้อยๆ ลองดูที่นิพจน์ของเรา เราไม่อนุญาตให้ เอาล่ะ สมมุติว่ามีการเว้นวรรคในนั้น จริงไหม? ใส่ช่องว่างท้ายรหัสผ่านแล้วเรียกใช้

$a = "qwerty12345";
if(preg_match("/+/",$a)) echo "รหัสผ่านถูกต้อง";

และเหตุใดเราจึงเห็นข้อความของเราเกี่ยวกับรหัสผ่านที่ถูกต้อง มันค่อนข้างง่าย... ฟังก์ชั่น preg_match(); หยุดการตรวจสอบในนัดแรก นั่นคือสัญลักษณ์ "q" ตรงกับรูปแบบที่เราอธิบายไว้ และอย่างอื่นไม่สำคัญสำหรับฟังก์ชันอีกต่อไป เราควรทำอย่างไร? ต่อไปนี้เป็นวิธีแก้ไข:

$a = "qwerty12345";
if(preg_match("/^+$/",$a)) echo "รหัสผ่านถูกต้อง";

โดยการเพิ่ม "^" ที่จุดเริ่มต้นของนิพจน์และ "$" ที่ท้าย เราจะบอกฟังก์ชันว่ารูปแบบควรตรงกับอะไร ทั้งหมดเส้น. หากคุณเรียกใช้รหัสนี้ คุณจะไม่เห็นข้อความ เนื่องจากมีอักขระที่ผิดกฎหมายอยู่ท้ายรหัสผ่าน - ช่องว่าง

ตอนนี้เปลี่ยนเมตาอักขระ "+" เป็นเมตาอักขระ "?" คุณคิดว่าจะเกิดอะไรขึ้น? อย่างถูกต้องจะไม่มีข้อความเกี่ยวกับความถูกต้องของรหัสผ่านเนื่องจากรหัสผ่านมีอักขระมากกว่าหนึ่งตัว ฉันหวังว่าฉันจะอธิบายการทำงานของ meta character ที่ใช้บ่อยทั้งสามนี้ได้อย่างถูกต้อง

บางครั้ง "ไม่" ก็ยังดีกว่า

อย่างน้อยเราก็ได้เรียนรู้วิธีตรวจสอบรหัสผ่านให้ถูกต้องแล้ว ซึ่งนั่นก็ดี! ฉันจะบอกคุณเกี่ยวกับวิธีอื่นในการค้นหาบางสิ่งในสตริง สมมติว่าเราต้องตรวจสอบว่าไม่มีตัวเลขในสตริงหรือไม่ วิธีการทำเช่นนี้? นี่คือบรรทัด:

(ผมใส่สัญลักษณ์ “-_+()” เหล่านี้ลงไปโดยเฉพาะ เพื่อชีวิตจะได้ไม่ดูหวานชื่น...) เราสามารถกำหนดนิพจน์ต่อไปนี้:

แต่คุณต้องยอมรับ เราไม่รู้เสมอไปว่ามีการใช้อักขระตัวไหนในบรรทัด แต่เรารู้แน่ว่าไม่ควรมีตัวเลขอยู่ในนั้น! ดังนั้นจึงมีเหตุผลมากกว่าที่จะเขียนเทมเพลตที่จะข้ามบรรทัดไป เลขที่ตัวเลขและไม่ใช่ที่มีอยู่ “โอ้พระเจ้า มีสัญลักษณ์ที่เข้าใจยากมากมายขนาดนี้!!!”- นี่คือตัวอย่างของนิพจน์ที่เรียบเรียงอย่างถูกต้องสำหรับปัญหาดังกล่าว:

$a = "a-_+()";
if(preg_match("/^[^0-9]+$/",$a)) echo "ไม่มีตัวเลข!";

เราบรรลุเป้าหมายนี้ได้อย่างไร? เราเข้าสัญลักษณ์แล้ว แต่!อักษรตัวพิมพ์ใหญ่ "^" ([^0-9]) วางไว้ที่จุดเริ่มต้นแสดงว่าจะมี ไม่ควรฉันหวังว่าสิ่งนี้จะได้รับการแก้ไข

เอาล่ะ มาสรุปช้าๆ กัน... ฉันจะให้สองตัวอย่างพร้อมคำอธิบาย ในระหว่างนี้เราจะเรียนรู้วิธีบันทึกผลการค้นหาลงในตัวแปร และเรียนรู้วิธีตรวจสอบความถูกต้องของที่อยู่ไปรษณีย์

เห็นแล้วเซฟไว้!

บล็อกของฉัน

$a = " บล็อกของฉัน";
preg_match("/ /", $ก);

ในนิพจน์ทั่วไปของเรา เราได้อธิบายอักขระที่เป็นไปได้ทั้งหมดที่สามารถรวมไว้ในลิงก์ได้ ฉันยังต้องการใส่ใจกับเครื่องหมายคำพูดและอักขระ “/” ในนิพจน์ของเราด้วย โดยจะมีเครื่องหมายแบ็กสแลชนำหน้าด้วย มีไว้เพื่ออะไร ความจริงก็คือ "/" และเครื่องหมายคำพูดนั้นเป็นอักขระพิเศษ และเพื่อให้เทมเพลตรับรู้ว่าเป็นสัญลักษณ์ธรรมดา เราจำเป็นต้องคัดกรองพวกมัน Escape ทำได้โดยการเพิ่มเครื่องหมายแบ็กสแลชหน้าอักขระพิเศษ ฉันหวังว่ามันจะชัดเจน

$a = " บล็อกของฉัน";
preg_match("/ /", $ก, $ข);

ดังนั้นจึงจำเป็นต้องเพิ่มพารามิเตอร์เพิ่มเติมในรูปแบบของตัวแปร $b ​​ซึ่งลิงก์ที่พบจะถูกจัดเก็บ คุณต้องรู้ด้วยว่าผลการค้นหานั้นอยู่ในอาร์เรย์ ดังนั้นตัวแปร $b ​​จึงเป็นอาร์เรย์ ข้อมูลที่เราค้นหาอยู่ภายใต้ดัชนี 1 ซึ่งหมายความว่าผลการค้นหาอยู่ในตัวแปร $b มาแสดงผลบนหน้าจอกัน:

$a = " บล็อกของฉัน";
preg_match("/ /", $ก, $ข);
เสียงสะท้อน $b;

ที่อยู่ที่ถูกต้องคือกุญแจสู่ความสำเร็จ!

และสุดท้ายคำตอบของคำถามคืออีเมลถูกต้องหรือไม่? ขั้นแรก คุณต้องค้นหาว่าอักขระใดบ้างที่ได้รับอนุญาตในที่อยู่ เท่าที่ฉันรู้ อักขระที่อนุญาตได้แก่:

  • ตัวอักษรภาษาอังกฤษ ตัวเลข “_” “-” อืม ดูเหมือนทุกอย่างจะเป็น... เราจะดำเนินการต่อจากนี้
  • ต่อไปเรามี "@"
  • ต่อมาเป็นตัวอักษรภาษาอังกฤษ
  • ต่อไปช่วง
  • และตัวอักษรภาษาอังกฤษอีกครั้ง...

ดังนั้นนิพจน์ทั่วไปจะเป็นดังนี้:

$a = " [ป้องกันอีเมล]";
if(preg_match("/^+@+.+$/", $a)) echo "ที่อยู่อีเมลถูกต้อง!";
else echo "ที่อยู่อีเมลไม่ได้เขียนอย่างถูกต้อง!";

เอาล่ะ... ฉันหวังว่าบันทึกดังกล่าวจะไม่ทำให้คุณกลัวในตอนนี้ และคุณก็สามารถเข้าใจมันได้แล้ว

สุดท้ายนี้ฉันอยากจะพูดอะไรสักอย่าง บทความนี้กลายเป็นเรื่องยุ่งยากและในขณะเดียวกันก็ครอบคลุมความเป็นไปได้เพียงบางส่วนเท่านั้น หากคุณกำลังอ่านประโยคนี้ เป็นไปได้มากว่าคุณจะได้อ่านมันจนจบ ซึ่งขอขอบคุณมาก

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

ผสม preg_match(รูปแบบสตริง, หัวเรื่องสตริง [, อาร์เรย์ &ตรงกัน [, ธง int [, int offset]]])

ค้นหาหัวเรื่องข้อความที่กำหนดเพื่อให้ตรงกับรูปแบบลวดลาย

หากมีการระบุพารามิเตอร์การจับคู่เพิ่มเติม จะมีการเติมผลการค้นหา องค์ประกอบ $matches จะมีส่วนของสตริงที่ตรงกับรูปแบบทั้งหมด ส่วน $matches จะมีส่วนของสตริงที่ตรงกับรูปแบบย่อยแรก และอื่นๆ

ธงสามารถรับค่าต่อไปนี้:

PREG_OFFSET_CAPTURE

หากระบุแฟล็กนี้ สำหรับแต่ละสตริงย่อยที่พบ ตำแหน่งในสตริงต้นทางจะถูกระบุ สิ่งสำคัญคือต้องจำไว้ว่าแฟล็กนี้เปลี่ยนรูปแบบของข้อมูลที่ส่งคืน: แต่ละเหตุการณ์จะถูกส่งกลับเป็นอาร์เรย์ องค์ประกอบที่ศูนย์ประกอบด้วยสตริงย่อยที่พบ และองค์ประกอบแรกประกอบด้วยออฟเซ็ต

การตั้งค่าสถานะนี้มีให้ใช้งานใน PHP 4.3.0 และสูงกว่า

พารามิเตอร์แฟล็กเพิ่มเติมมีให้ใช้งานตั้งแต่ PHP 4.3.0

ค้นหาจากซ้ายไปขวาตั้งแต่ต้นบรรทัด สามารถใช้พารามิเตอร์ออฟเซ็ตเผื่อเลือกเพื่อระบุตำแหน่งเริ่มต้นสำรองสำหรับการค้นหาได้ พารามิเตอร์ออฟเซ็ตเพิ่มเติมมีให้ใช้งานตั้งแต่ PHP 4.3.3ความคิดเห็น: การใช้พารามิเตอร์ offset ไม่เทียบเท่ากับการแทนที่สตริงที่ตรงกันด้วย substr($subject, $offset) เมื่อเรียกใช้ฟังก์ชัน preg_match_all() ^ , $ เนื่องจากรูปแบบอาจมีเงื่อนไขเช่น (? หรือ

- เปรียบเทียบ:

ในขณะที่ตัวอย่างนี้ การทำงาน preg_match() การทำงานส่งคืนจำนวนรายการที่ตรงกันที่พบ การใช้พารามิเตอร์ offset ไม่เทียบเท่ากับการแทนที่สตริงที่ตรงกันด้วย substr($subject, $offset) เมื่อเรียกใช้ฟังก์ชันอาจเป็น 0 (ไม่พบรายการที่ตรงกัน) และ 1 เพราะ การทำงานหยุดทำงานหลังจากพบนัดแรก หากคุณต้องการค้นหาหรือนับรายการที่ตรงกันทั้งหมด คุณควรใช้ฟังก์ชัน - การทำงานผลตอบแทน

เท็จในกรณีที่มีข้อผิดพลาดเกิดขึ้นระหว่างการดำเนินการ การทำงานเบาะแส: อย่าใช้ฟังก์ชันหากคุณต้องการตรวจสอบว่ามีสตริงย่อยอยู่ในสตริงที่กำหนดหรือไม่ ใช้สำหรับสิ่งนี้สตรอส()


หรือ

/*
strstr()
เนื่องจากพวกเขาจะทำงานนี้ให้เสร็จเร็วขึ้นมาก
ตัวอย่างที่ 2 ค้นหาคำว่า "เว็บ" ในข้อความ
*/
ลำดับพิเศษ \b ในรูปแบบหมายถึงขอบเขตของคำ ดังนั้น จะมีเพียงคำว่า "เว็บ" เกิดขึ้นเพียงส่วนเดียวเท่านั้นที่จะตรงกัน)) {
หน้ากาก ซึ่งตรงข้ามกับ "สายรัด" หรือ "ใยแมงมุม" ถ้า (preg_match("/\bweb\b/i" ,;
"PHP เป็นภาษาสคริปต์เว็บที่คุณเลือก"
หน้ากาก ซึ่งตรงข้ามกับ "สายรัด" หรือ "ใยแมงมุม" เสียงสะท้อน;
"พบรายการแล้ว" ) อื่น ()) {
หน้ากาก ซึ่งตรงข้ามกับ "สายรัด" หรือ "ใยแมงมุม" ถ้า (preg_match("/\bweb\b/i" ,;
"PHP เป็นภาษาสคริปต์เว็บที่คุณเลือก"
หน้ากาก ซึ่งตรงข้ามกับ "สายรัด" หรือ "ใยแมงมุม" เสียงสะท้อน;
}
?>

"ไม่พบรายการ"

)preg_match ("/\bweb\b/i" ,
เริ่มจากข้อเท็จจริงที่ว่ามีหลายฟังก์ชันสำหรับการทำงานกับนิพจน์ทั่วไปใน PHP แต่ส่วนใหญ่มักใช้สามฟังก์ชัน:

  • preg_replace - ค้นหาและแทนที่ข้อความที่ตรงกับนิพจน์ทั่วไป
  • preg_match - เพียงการค้นหาปกติ
  • preg_split - ค้นหาและแยกข้อความ

อย่างน้อยในบทเรียนก่อนหน้านี้เราใช้มัน แม่นยำยิ่งขึ้น แทนที่จะเป็น preg_match มี preg_match_all แต่โดยพื้นฐานแล้วนี่คือสิ่งเดียวกัน เฉพาะอย่างหลังเท่านั้นที่ไม่ขัดจังหวะการค้นหาหลังจากการค้นพบครั้งแรก นั่นคือหากเราใช้ preg_match เราจะไม่พบรายการทั้งหมด แต่จะพบเฉพาะรายการแรกเท่านั้น

การเลือกฟังก์ชันที่จะใช้ในสถานการณ์ใดก็ค่อนข้างง่าย เราจำเป็นต้องแทนที่ - เราใช้การแทนที่ เช่นในกรณีที่เราต้องการลบส่วนที่ไม่จำเป็นของโค้ดเพจ จำได้ไหม?

$page = preg_replace("/ ^]/i", "", $page); $page = preg_replace("/ ^]/i", "", $page); $page = str_replace("",", $เพจ);

พารามิเตอร์แรกของฟังก์ชันคืออักขระปกติที่กำหนดสิ่งที่เรากำลังมองหา อย่างที่สองคือสิ่งที่เราแทนที่ด้วย ประการที่สาม - เรากำลังมองหาที่ไหน? ดังนั้นเราจึงนำตัวแปร $page และกำหนดผลลัพธ์ของฟังก์ชัน preg_replace ให้กับตัวแปรที่เราค้นหา input type=checkbox ทั้งหมด รวมถึงป้ายกำกับการเปิดและปิด พวกเขาแทนที่ด้วย "นั่นคือพวกเขาเพียงแค่ลบออก ฉันหวังว่าทุกอย่างชัดเจนที่นี่ เราจะวิเคราะห์นิพจน์เอง (พารามิเตอร์แรกของฟังก์ชัน) ในภายหลังเล็กน้อย
นอกจากนี้ยังมีตัวอย่างของการใช้ preg_match_all ซึ่งมีประโยชน์ในการค้นหาลิงก์ทั้งหมดในข้อความที่เหลือ เราต้องการลิงก์เนื่องจากมีคำหลักที่เรากำลังแยกวิเคราะห์ นี่คือสิ่งที่เกิดขึ้น:

Preg_match_all("/ ]+?>(.*?)<\/a>/uis",$page,$ok); สำหรับ ($j=0; $j ".$โอเค[$j]""; }

พารามิเตอร์แรกเป็นนิพจน์ทั่วไปอีกครั้งเพื่อค้นหาลิงก์ทั้งหมดที่อยู่ในแท็ก "a" ตามธรรมชาติ (หากคุณไม่คุ้นเคยกับมาร์กอัป html ให้อ่าน) ประการที่สองคือตัวแปรที่มีข้อความที่จะค้นหา พารามิเตอร์ตัวที่สามคือตัวแปรซึ่งวางผลลัพธ์ไว้ - $ok หลังจากนี้ สิ่งที่เหลืออยู่คือต้องผ่านองค์ประกอบที่จำเป็นทั้งหมดของ $ok เพื่อให้ได้คีย์ที่เราต้องการ ควรแยกจากกันว่าที่เอาต์พุตเราได้รับอาเรย์หลายมิติ นั่นคือเหตุผลที่เราแสดงมันด้วยวิธีที่ซับซ้อน: $ok[$j] หากต้องการดูโครงสร้างของอาร์เรย์ ให้ใช้ฟังก์ชันด้านล่างแล้วคุณจะเข้าใจทุกอย่าง

Print_r($ตกลง);

ดูเหมือนว่าเราได้แยกแยะฟังก์ชั่นที่เราใช้สำหรับงานของเราแล้ว ตอนนี้สิ่งที่เหลืออยู่คือการเรียนรู้วิธีเขียนนิพจน์ทั่วไปที่เหมือนกันซึ่งเป็นพารามิเตอร์แรกของแต่ละวิธีเหล่านี้ เรามาดูสิ่งที่สำคัญที่สุดกันดีกว่า

วิธีเขียนประโยคปกติ

ก่อนอื่นเรามาดูโครงสร้างพื้นฐานกันก่อน นิพจน์มีตัวเลือก ระบุด้วยตัวอักษรตัวเดียวและเขียนต่อท้าย นำหน้าด้วยเครื่องหมายทับ

นอกจากนี้ ยังรองรับอักขระเมตาต่อไปนี้:

ในทางกลับกัน MetaCharacters สามารถมีตัวแก้ไขได้:

ตอนนี้เราสามารถวิเคราะห์รูปแบบปกติของเราจากบทเรียนที่แล้วได้แล้ว จากสัญญาณข้างต้นเรามาลองทำความเข้าใจกับสิ่งที่เรามีกันดีกว่า นี่คือการแสดงออก:

/^]/i

เครื่องหมายทับตัวแรกและตัวสุดท้าย “/” ระบุว่ามีนิพจน์ทั่วไปอยู่ข้างใน ในเวลาเดียวกันหลังจากอันสุดท้ายเราใส่ "i" นี่เป็นตัวเลือกเช่นเดียวกับในตารางแรก - อย่าคำนึงถึงตัวพิมพ์เล็กและใหญ่ ภายในเครื่องหมายทับคือลำดับปกตินั่นเอง โดยเริ่มต้นด้วยเครื่องหมายน้อยกว่าและแท็กอินพุต และทุกอย่างที่ตามมาหลังจากนั้นจนกระทั่งเครื่องหมายจุดเป็นเพียงข้อความธรรมดาที่ต้องค้นหา แต่ตัวจุดและสัญลักษณ์ที่อยู่ด้านหลังนั้นน่าสนใจมากกว่า ในกรณีนี้คือ การก่อสร้าง “.*?” หมายถึงลำดับของอักขระใดๆ นั่นคือถ้าเรารวมเฉพาะข้อความเข้ากับโครงสร้างนี้ เราจะเลือกข้อความทั้งหมดหลังจากการเกิดขึ้นครั้งแรกและจนจบ หากต้องการหยุด คุณจะต้องพบกับแท็กปิด HTML “มากกว่า” หรืออักขระขึ้นบรรทัดใหม่ การออกแบบนี้ทำให้เรามีโอกาสเช่นนี้:

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

ลองดูอีกสิ่งหนึ่งที่จะทำให้ทุกอย่างแข็งแกร่งขึ้น เราค้นหาลิงก์กับพวกเขา:

/]+?>(.*?)<\/a>/uis

เราอ่านสำนวน ขอย้ำอีกครั้งว่าเราจะทิ้งเครื่องหมายทับและตัวเลือกก่อน ธง "uis" อธิบายได้ในตัวเอง ยกเว้น "u" ซึ่งฉันไม่ได้อธิบาย - มันแสดงว่าเรากำลังใช้การเข้ารหัส Unicode เหลือไม่มากแล้ว จุดเริ่มต้นคือแท็ก "a" ซึ่งเปิดขึ้นมา จากนั้นก็มาถึงชั้นเรียน

ซึ่งหมายถึงไม่มากกว่าหรือน้อยกว่า (การเปิดและปิดแท็ก HTML) ซึ่งก็คืออักขระใดๆ ในกรณีนี้ “+?” ถูกเพิ่มเข้าไปในชั้นเรียน ซึ่งหมายความว่าชั้นเรียนนี้จะมีอยู่ 1 ครั้งขึ้นไป (แต่อย่างน้อย 1 ครั้งแน่นอน) จากนั้นจะมีแท็กปิด html สำหรับแท็ก “a” มีข้อความภายในลิงค์ที่กลุ่มระบุ

ท้ายที่สุดเราไม่รู้ว่าจะมีข้อความประเภทใดดังนั้นเราจึงกำหนดกลุ่มดังกล่าว และในตอนท้ายจะมีแท็กปิด “a”:

โปรดทราบว่าเราจะหลีกเครื่องหมายทับโดยใช้แบ็กสแลชเพื่อให้มองว่าเป็นข้อความธรรมดา

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