การจับกลุ่มในนิพจน์ทั่วไปใน PHP
เนื้อหาของการจับกลุ่มไม่เพียงแต่สามารถเข้าถึงได้ใน สตริงการแทนที่ แต่ยังอยู่ในนิพจน์ทั่วไปเอง: เรา สามารถใส่บางอย่างลงในการจับกลุ่ม แล้วหลังจากนั้น ในนิพจน์ทั่วไปเองสามารถระบุได้ว่า ตรงนี้ควร เป็นเนื้อหาของการจับกลุ่มนั้น
สามารถเข้าถึงเนื้อหาของการจับกลุ่มได้ตามหมายเลขของพวกมัน,
โดยมีเครื่องหมายแบ็กสแลชนำหน้า ตัวอย่างเช่น,
การจับกลุ่มศูนย์จะสามารถเข้าถึงได้แบบนี้: \0,
การจับกลุ่มแรกแบบนี้ - \1, การจับกลุ่มที่สอง
- \2 และต่อไปเรื่อยๆ
ฉันเชื่อว่าทุกสิ่งที่เขียนมาข้างต้นคงยังค่อนข้าง คลุมเครือสำหรับคุณ นี่ไม่น่าแปลกใจ เนื่องจาก การจับกลุ่มเป็นส่วนที่เข้าใจยากที่สุด ของนิพจน์ทั่วไป ลองมาทำความเข้าใจด้วยตัวอย่างกัน
ตัวอย่าง
สมมติว่าเรามีสตริงดังนี้:
<?php
$str = 'aa bb cd ef';
?>
ลองหาตำแหน่งทั้งหมดในสตริงนั้น ที่มี ตัวอักษรสองตัวใดๆ ที่เหมือนกันเรียงต่อกัน สำหรับการแก้ปัญหา เราจะค้นหาตัวอักษรใดๆ, ใส่มันลงในการจับกลุ่ม จากนั้นตรวจสอบว่า ตัวอักษรถัดไปเป็นเนื้อหาของการจับกลุ่มนั้นหรือไม่:
<?php
$res = preg_replace('#([a-z])\1#', '!', $str);
?>
ผลลัพธ์ที่เขียนลงในตัวแปรจะเป็นดังนี้:
'! ! cd ef'
ตัวอย่าง
สมมติว่าเรามีสตริงดังนี้:
<?php
$str = 'asxca buzxb csgd';
?>
ลองหาคำทั้งหมดในสตริงนั้น ที่มี ตัวอักษรตัวแรกและตัวสุดท้ายเหมือนกัน สำหรับการแก้ปัญหา ให้เขียนรูปแบบดังนี้: ตัวอักษร, ตามด้วยตัวอักษรหนึ่งตัวหรือมากกว่า และจากนั้นตัวอักษร ที่เหมือนกับตัวแรก:
<?php
$res = preg_replace('#([a-z])[a-z]+\1#', '!', $str);
?>
ผลลัพธ์ที่เขียนลงในตัวแปรจะเป็นดังนี้:
'! ! csgd'
ตัวอย่าง
แทนที่จะใช้ \1 สามารถเขียน \g1 ได้:
<?php
$res = preg_replace('#([a-z])[a-z]+\g1#', '!', $str);
?>
ตัวอย่าง
ยังสามารถเขียน \g{1} ได้:
<?php
$res = preg_replace('#([a-z])[a-z]+\g{1}#', '!', $str);
?>
ตัวอย่าง
ในเครื่องหมายปีกกาสามารถระบุตัวเลขติดลบได้ ในกรณีนี้ การจับกลุ่มจะนับจากท้าย:
<?php
$res = preg_replace('#([a-z])([a-z])\g{-2}#', '!', $str);
?>
โจทย์ฝึกปฏิบัติ
กำหนดสตริง:
<?php
$str = 'aaa bbb ccc xyz';
?>
ค้นหาสตริงย่อยทั้งหมด ที่มี ตัวอักษรสามตัวที่เหมือนกันเรียงต่อกัน
กำหนดสตริง:
<?php
$str = 'a aa aaa abab bbbb';
?>
ค้นหาสตริงย่อยทั้งหมด ที่มี ตัวอักษรที่เหมือนกันสองตัวหรือมากกว่าเรียงต่อกัน
กำหนดสตริง:
<?php
$str = 'aaa aaa bbb bbb ccc ddd';
?>
ค้นหาสตริงย่อยทั้งหมด ที่มี คำที่เหมือนกันสองคำเรียงต่อกัน