หมายเลขรวมของกลุ่มจับใน Regular Expressions PHP
พิจารณาสถานการณ์ต่อไปนี้ สมมติว่าเรามี
ตัวแปรเก็บปี ซึ่งสามารถเปลี่ยนแปลงได้
ตั้งแต่ 1990 ถึง 2099
สมมติว่าเราต้องการดึงสองหลักสุดท้ายของปี
เข้าไปในกลุ่มจับ มาเขียนนิพจน์ทั่วไปที่เกี่ยวข้อง:
<?php
$reg = '#19(9\d)|20(\d\d)#';
?>
อย่างไรก็ตาม มีสิ่งไม่สะดวกอย่างหนึ่งรอเราอยู่ที่นี่ ประเด็นคือ สำหรับปีในศตวรรษที่แล้ว สองหลัก จะตกไปอยู่ในกลุ่มจับแรก แต่สำหรับปีใน ศตวรรษที่สอง - จะไปอยู่ในกลุ่มจับที่สอง มาดูตัวอย่าง
นี่คือตัวเลือกแรก:
<?php
$str = '1991';
preg_match($reg, $str, $res);
var_dump($res); // [1 => '91']
?>
และนี่คือตัวเลือกที่สอง:
<?php
$str = '2021';
preg_match($reg, $str, $res);
var_dump($res); // [2 => '21']
?>
ตอนนี้สมมติว่าเราต้องการบันทึกตัวเลขปีที่พบ ไว้ในตัวแปร เรากำลังจะเจอปัญหา เพราะเราไม่รู้แน่ชัดว่าต้องดึงข้อมูล จากกลุ่มจับด้วยคีย์ใด:
<?php
$year = $res[1]; // ต้องการคีย์เป็น 1 หรือ 2
?>
สามารถแก้ปัญหาได้ด้วยเงื่อนไข:
<?php
if (!empty($res[1])){
$year = $res[1];
} else{
$year = $res[2];
}
?>
อย่างไรก็ตาม มีวิธีแก้ปัญหาที่ง่ายกว่า สามารถใช้
คำสั่งพิเศษ (?| ) กลุ่มจับทั้งหมด
ที่อยู่ภายในมันจะมีหมายเลขเดียวกัน
มาแก้ไขนิพจน์ทั่วไปของเรา
<?php
$reg = '#(?|19(9\d)|20(\d\d))#';
?>
และตอนนี้ปีของเราจะอยู่ในกลุ่มจับ หมายเลขหนึ่งอย่างแน่นอน:
<?php
$year = $res[1];
?>
ให้สตริงที่มีวันที่ โดยที่ปีสามารถ
เปลี่ยนแปลงได้ตั้งแต่ 1990 ถึง 2099:
<?php
$arr = [
'31-12-2025',
'30-11-1995',
'29-10-1990',
];
?>
สำหรับแต่ละวันที่ ให้วางวันลงในกลุ่มจับแรก เดือนลงในกลุ่มจับที่สอง และสองหลักสุดท้ายของปี - ลงในกลุ่มจับที่สาม