PHP ตรวจสอบค่าสำหรับ int การตรวจสอบนิพจน์ทั่วไปสำหรับตัวเลข ตรวจสอบว่าตัวแปรเป็นจำนวนเต็มใน PHP หรือไม่
จากผู้เขียน: สวัสดีเพื่อนๆ ในบทความนี้ เราจะเริ่มศึกษาความสามารถของนิพจน์ทั่วไปโดยตรง ทำความคุ้นเคยกับฟังก์ชัน preg_match() ใน PHP และสร้างนิพจน์ทั่วไปตัวแรกเพื่อตรวจสอบตัวเลข
อาจคุ้มค่าที่จะเริ่มต้นบทความนี้โดยที่นิพจน์ทั่วไปเป็นเครื่องมือที่ทรงพลังมากในการทำงานกับข้อความ ดังที่คุณทราบอยู่แล้วว่าด้วยความช่วยเหลือของนิพจน์ทั่วไป เราสามารถค้นหาอะไรก็ได้ที่อยู่ในอาร์เรย์ของข้อความ อย่างไรก็ตาม อำนาจดังกล่าวไม่ควรถูกใช้ในทางที่ผิด อย่าลืมว่า PHP มีฟังก์ชันมากมายสำหรับการทำงานกับสตริง ประเภท และอื่นๆ ซึ่งช่วยให้เราสามารถตรวจสอบการมีอยู่ของอักขระหรือสตริงย่อยในสตริงได้
ดังนั้น หากเป็นไปได้ที่จะแก้ปัญหาโดยไม่ใช้นิพจน์ทั่วไป ก็คุ้มค่าที่จะใช้โอกาสนี้ เนื่องจากฟังก์ชันสำหรับการทำงานกับนิพจน์ทั่วไปมักจะใช้ทรัพยากรมากกว่า ในกรณีนี้ ปัญหาสามารถแก้ไขได้โดยไม่ต้องใช้นิพจน์ทั่วไป ตัวอย่างเช่น คุณสามารถตรวจสอบว่าอักขระทั้งหมดในสตริงเป็นตัวเลขหรือไม่โดยใช้ฟังก์ชัน ctype_digit()
แต่ตามเงื่อนไขของงานในบทความ เราจำเป็นต้องใช้นิพจน์ทั่วไป ดังนั้นเราจะแก้ปัญหาโดยใช้ฟังก์ชัน preg_match() ฟังก์ชันนี้จะตรวจสอบสตริงกับรูปแบบนิพจน์ทั่วไป ฟังก์ชั่นนี้มี 5 พารามิเตอร์ ซึ่งในทางปฏิบัติจะใช้เพียง 2 ตัวแรกเท่านั้น
พารามิเตอร์แรกของฟังก์ชันจะเป็นรูปแบบนิพจน์ทั่วไป ประการที่สองคือสตริงที่กำลังตรวจสอบ บางครั้งเราอาจต้องการพารามิเตอร์ตัวที่สาม โดยระบุว่าเราจะรับอาร์เรย์พร้อมกับผลการค้นหาตัวใด
มาสร้างเทมเพลตแรกของเรากัน อาจมีลักษณะเช่นนี้:
$รูปแบบ = "#^+$#";
$รูปแบบ = "#^+$#" ; |
เมื่อมองแวบแรกอาจดูเข้าใจยากและค่อนข้างน่ากลัว อย่างไรก็ตามไม่มีอะไรน่ากลัวที่นี่ตอนนี้เรามาดูกันดีกว่า เริ่มต้นด้วยความจริงที่ว่านิพจน์ทั่วไปใช้อักขระพิเศษที่เรียกว่า อักขระเมตา มีจำนวนมากในเทมเพลตของเรา:
^ — metaCharacter สำหรับจุดเริ่มต้นของบรรทัด
$ - เมตาอักขระจุดสิ้นสุดของบรรทัด
- metaตัวละครคลาสตัวละคร
+ เป็นตัวระบุปริมาณที่แสดงถึงอักขระหรือกลุ่มอักขระ 1 รายการขึ้นไปที่ตามด้วยตัวระบุ
แล้วเราได้อะไร? คุณจะอ่านรูปแบบนิพจน์ทั่วไปที่ประกอบด้วยได้อย่างไร และมันอ่านดังนี้:
สตริงทั้งหมดจะได้รับการตรวจสอบตั้งแต่ต้นจนจบ (อักขระเมตา ^$)
บรรทัดสามารถมีได้เฉพาะตัวเลขตั้งแต่ 0 ถึง 9 ()
บรรทัดจะต้องมีอย่างน้อยหนึ่งหลัก (+)
ตอนนี้เรามาตรวจสอบเทมเพลตที่ใช้งานจริงกัน
อย่างที่คุณเห็น นิพจน์ทั่วไปทำงานได้อย่างถูกต้อง เฉพาะบรรทัดที่ประกอบด้วยตัวเลขทั้งหมดเท่านั้นจึงจะพอดี อย่างไรก็ตามหากคุณกำลังทดสอบบนเว็บไซต์ regexr.com และมีข้อความมากกว่าหนึ่งบรรทัดคุณจะต้องระบุแฟล็กพิเศษสำหรับเทมเพลต - m ซึ่งจะช่วยให้เทมเพลตทำงานกับหลายบรรทัดได้ ข้อความบรรทัด คุณสามารถทำได้ที่มุมขวาบน แฟล็กรายการเมนู
โปรดทราบว่าจะเกิดอะไรขึ้นหากเราลบอักขระเมตาเริ่มต้นและ/หรือจุดสิ้นสุดของบรรทัด:
ตอนนี้เราไม่ได้ตรวจสอบความถูกต้องของบรรทัดทั้งหมด แต่เพียงมองหาบางสิ่งบางอย่างในบรรทัด เป็นผลให้พบตัวเลขในบรรทัดที่สามแม้ว่าบรรทัดนี้ไม่เหมาะกับเราตามเงื่อนไขของปัญหาก็ตาม ตอนนี้ลองใช้ฟังก์ชัน preg_match และตรวจสอบแต่ละบรรทัดทีละบรรทัด:
$arr = ["123", "ทดสอบ", "45ew45", "456"]; $รูปแบบ = "#^+$#"; foreach($arr เป็น $item)( if(preg_match($pattern, $item))( echo "
สตริง $item มีเพียงตัวเลขเท่านั้น
"; )else( เสียงสะท้อน "บรรทัด $item ไม่เหมาะสม
"; } }$arr = [ "123" , "ทดสอบ" , "45ew45" , "456" ] ; $รูปแบบ = "#^+$#" ; foreach ($arr เป็น $item) ( |
ขณะนี้งานที่กำลังดำเนินการอยู่บนเว็บไซต์เพื่อเปิดตัวส่วนใหม่ และเมื่อเขียนสคริปต์จำเป็นต้องตรวจสอบตัวแปรเพื่อหาตัวเลข และไม่ใช่แค่ตัวเลข (เพราะว่า 1.5 ก็เป็นตัวเลขด้วย) แต่เป็นจำนวนเต็มด้วย และนี่คือวิธีที่ฉันทำเช็คนี้
ตรวจสอบว่าตัวแปรเป็นจำนวนเต็มใน PHP หรือไม่หากต้องการตรวจสอบใน PHP ว่าตัวเลขเป็นจำนวนเต็มหรือไม่ เราใช้นิพจน์ทั่วไป:
ดังนั้น หากตัวแปรเป็นจำนวนเต็ม เราจะดำเนินการตามที่เราต้องการและในทางกลับกัน
การตรวจสอบว่าตัวแปรเป็นจำนวนเต็มใน JavaScript หรือไม่ใน JavaScript สิ่งต่างๆ จะแตกต่างออกไปเล็กน้อย และที่นี่เราต้องเขียนฟังก์ชันเล็กๆ ของเราเอง:
ฟังก์ชั่น number_scan(num) ( return (num ^ 0) === num; )
และใช้สำหรับการทดสอบ:
ฟังก์ชั่น number_scan(num) ( return (num ^ 0) === num; ) var number = "1.3";
if(number_scan(number)) ( // การกระทำหากตัวเลขเป็นจำนวนเต็ม) else ( // การกระทำหากตัวเลขเป็นเศษส่วนหรือตัวแปรไม่ใช่ตัวเลขเลย)
ในกรณีนี้ หากตัวแปรเท่ากับจำนวนเต็ม การกระทำที่คุณต้องการจะถูกดำเนินการและในทางกลับกัน
สคริปต์แสดงรายการราคาในร้านค้าสำหรับผลิตภัณฑ์ผลิตภัณฑ์ พารามิเตอร์หน้าทางเลือกระบุหมายเลขหน้า หากไม่ได้ระบุหน้าและ URL ดูเหมือน http://example.com/price.php?product=859844 เราจะแสดงหน้าแรก
ก่อน PHP 5.2.0 ปัญหาสามารถแก้ไขได้ด้วยวิธีง่ายๆ นี้
// ฟังก์ชันสำหรับรับพารามิเตอร์ที่เป็นตัวเลขธรรมชาติ // $arr = อาร์เรย์ของพารามิเตอร์ ($GET หรือ $POST), $name = ชื่อของพารามิเตอร์ // ฟังก์ชันส่งคืนค่าของพารามิเตอร์ หรือ $default หากพารามิเตอร์หายไปหรือฟังก์ชันไม่ถูกต้อง get_param_nat($ arr, $name, $default=null) ( if (!isset($arr[$name])) return $default; // ตรวจสอบด้วยวิธีที่ง่ายมาก แปลงค่า พารามิเตอร์เป็นตัวเลข จากนั้นกลับไปที่สตริง // หากทุกอย่างเรียบร้อยดี สตริงผลลัพธ์จะต้องตรงกับค่าดั้งเดิมของพารามิเตอร์ $val = $arr[$name]; $intval = intval($val); เราตรวจสอบว่าตัวเลขที่เรามีมากกว่าศูนย์ if (strval($intval) != = $val || $intval< 1) return $default; return $intval; } // Проверяем параметр product if (($product = get_param_nat($_GET, "product")) === null) die("Product not found"); // Получаем номер страницы $page = get_param_nat($_GET, "page", 1);
เริ่มต้นในเวอร์ชัน 5.2.0 กลุ่มฟังก์ชันตัวกรองปรากฏใน PHP: filter_var, filter_input, filter_var_array และอื่นๆ อีกมากมาย ฟังก์ชันสามารถตรวจสอบตัวแปรสำหรับจำนวนเต็ม หมายเลขทศนิยม อีเมล ที่อยู่ IP URL ฯลฯ และยังล้างสตริงตามพารามิเตอร์ที่ระบุอีกด้วย
มาเขียนโค้ดใหม่โดยใช้ฟังก์ชัน filter_input
ฟังก์ชั่น get_param_nat($type, $name, $default=null) ( $val = filter_input($type, FILTER_VALIDATE_INT, array("min_range" => 1, "max_range" => PHP_INT_MAX)); // filter_input ส่งคืน false หากกรอง ล้มเหลว หรือเป็นโมฆะ หากไม่ได้กำหนดตัวแปร if ($val === null || $val === false) return $default; return $val ) // ตรวจสอบพารามิเตอร์ผลิตภัณฑ์ if (($product = get_param_nat(INPUT_GET) , "ผลิตภัณฑ์")) === null) die("ไม่พบผลิตภัณฑ์"); // รับหมายเลขหน้า $page = get_param_nat(INPUT_GET, "page", 1);
การทดสอบเล็กน้อยแสดงให้เห็นว่าความเร็วของการทำงานของฟังก์ชัน get_param_nat ทั้งสองตัวแปรนั้นเกือบจะเท่ากัน และในกรณีที่ไม่มีพารามิเตอร์ เช่น ไม่ได้ระบุหน้า ตัวแปรแรกจะทำงานเร็วขึ้นอีกเล็กน้อย
ดังนั้นมันขึ้นอยู่กับคุณที่จะตัดสินใจว่าจะใช้อะไร ฉันใช้ฟังก์ชันแรกเป็นการส่วนตัว มันใกล้กว่าและชัดเจนกว่าสำหรับฉัน
การพูดนอกเรื่องโคลงสั้น ๆ ในตอนท้าย เพื่อหลีกเลี่ยงการทำซ้ำหน้าสำหรับเครื่องมือค้นหา เช่น ไม่มีหน้าและมี page=1 ฉันขอแนะนำให้ระบุ URL ตามรูปแบบบัญญัติในส่วนหัวของหน้า มันจะมีลักษณะดังนี้:
...