Regular Expression-ийг халь мөлт ойлгосноосоо та бүгдтэй хуваалцъя.

Вебээ хийх явцад яалт ч үгүй сурсан нэг зүйл бол Regex буюу Regular Expression юм. Текст мэдээлэлтэй харьцах дараах тохиолдлуудад үүнийг хэрэглэхээс өөр аргагүй бололтой. Үүнд:

  1. Текстэд тодорхой тэмдэг эсвэл үг байгаа эсэхийг шалгах
  2. Текстээс хэрэгтэй хэсгээ хайж олох
  3. Текстийн зарим хэсгийг солих өөрчлөх
  4. Текстийг хэсэглэн хуваах
  5. Текстийн бүтцийг шалгах, жишээлбэл. цахим шуудангийн хаяг эсэх, утасны дугаар эсэх, веб хуудасны хаяг эсэх зэрэг.

Тийнхүү regex-ийг тойрч зугтах аргагүй болсон шалтгаан нь regex-ийг ашиглан гүйцэтгэж болох үйлдлийг гүйцэтгэдэг функцүүд PHP хэлний сүүлийн үеийн хувилбаруудад орхигдох болсон явдал юм.

Бичсэн Regular Expression-ээ шалгах, турших

"Regex tester" түлхүүр үгээр "гүүглэдэхэд" хангалттай олон тестерүүд олдох бөгөөд би хувьдаа myregextester.com сайтыг ашиглаж байна.

Regex-д ашиглагддаг тусгай тэмдэгтүүд

. * + - ? ^ $ [ ] ( ) | &

Бүлэг тэмдэгтүүдийг заах

"2012-06-01" маягийн текстээс оныг нь ялгаж авъя гэвэл

[0-9]{4}

гэж бичнэ. Энд [0-9] гэдэг нь 0-ээс 9 хүртэлх бүх тэмдэгт буюу цифрүүд гэсэн утгатай. Харин [a-z] гэвэл a-аас z хүртэлх бүх үсгүүд гэсэн үг. Хэрвээ [0-9-] гэвэл цифрүүд бас - тэмдгийг авах болно.

Харин

[^-]{4}

- хасахаас ялгаатай 4 тэмдэгтийг авах болно. Өөрөөр хэлбэл өмнөх хэвтэй адил үр дүнг гарна гэсэн үг. Хэрэв [^a-z] гэвэл a-z үсгүүдээс бусад тэмдэгтүүд гэсэн утгыг илэрхийлнэ.

Давтагдсан тэмдэгтүүдийг заах

? + ба * тэмдгүүдийг ашиглах ба харилцан адилгүй утгыг илэрхийлнэ. ? нь заасан тэмдэгт зөвхөн нэг удаа байх эсвэл огт байхгүйг илэрхийлнэ. Тэгвэл + нь нэг эсвэл үүнээс олон удаа гэсэн утгатай бол * нь хэдэн ч удаа байж болохыг заахаас гадна байхгүй байхыг зөвшөөрдөг.

2012-06-01 текстийн хувьд 

[0-9]?

гэвэл

Array:
(
    [0] => Array
        (
            [0] => 2
            [1] => 0
            [2] => 1
            [3] => 2
            [4] => 
            [5] => 0
            [6] => 6
            [7] => 
            [8] => 0
            [9] => 1
            [10] => 
        )

)

харин

[0-9]+

гэвэл

Array:
(
    [0] => Array
        (
            [0] => 2012
            [1] => 06
            [2] => 01
        )

)

тохирлууд гарах ба

[0-9]*

хэвийн хувьд

Array:
(
    [0] => Array
        (
            [0] => 2012
            [1] => 
            [2] => 06
            [3] => 
            [4] => 01
            [5] => 
        )

)

тохирол гарна.

Хэрэв заасан тэмдэгт тодорхой тооны удаа давтагдахыг заах бол {давтагдах тоо} эсвэл {давтагдах тооны минимум, давтагдах тооны максимум} командыг нэмж өгнө.

[0-9]{4}

хэвийг авбал

Array:
(
    [0] => Array
        (
            [0] => 2012
        )

)

харин

[0-9]{2,4}

гэвэл

Array:
(
    [0] => Array
        (
            [0] => 2012
            [1] => 06
            [2] => 01
        )

)

үр дүн гарна.

Дурын тэмдэгт ба тэмдэгтүүдийг заах

Дурын ямар нэг тэмдэгтийг . цэгээр төлөөлүүлдэг. Харин дурын олон тэмдэгтийг дээр дурдсанчлан .+ эсвэл .* эсвэл .{тоо} эсвэл .{минимум тоо, максимум тоо} хэвүүдийн аль тохирохоор тодорхойлно.

Regex-ийн тусгай тэмдэгтүүдийг заах

Regex-нд түлхүүр үг маягаар ашиглагддаг тэмдэгтүүд байдгийг дээр дурдсан. Тэдгээрийг бүлэг тэмдэгт маягаар заах өөрөөр хэлбэл [] хаалт дотор бичихээс бусад үед урд нь налуу зураасыг бичиж өгдөг. Жишээ болгон image.jpg зургийн нэрнээс өргөтгөлийг нь цэгтэй нь хамтаар ялгаж авах хэвийг бичье гэвэл [.]jpg эсвэл .jpg гэж болно.

Дэд хэвүүдийг үүсгэх

image.jpg зургийн нэр ба өргөтгөл аль алийг нь ялгаж авах шаардлага гарсан гэе. Тэгвэл () дугуй хаалт ашиглан

([a-z]+)(.jpg)

хэвийг бичиж болох ба тохирол нь дараах маягтай байна.

Array:
(
    [0] => Array
        (
            [0] => image.jpg
        )

    [1] => Array
        (
            [0] => image
        )

    [2] => Array
        (
            [0] => .jpg
        )

)

Хувилбарт хэвийг үүсгэх

Файлын нэрсээс jpg, jpeg, png ба gif өргөтгөлүүдтэй зургийн файлын нэр ба өргөтгөлийг ялгаж авах хэвийг бичье. Иймэрхүү тохиолдолд | тэмдэгтийг ашиглаж болдог.

([a-z]+).(jpe?g|png|gif)

хэвийг

photo.jpg
image.jpeg
picture.png
logo.gif
archive.zip

текст дээр ажиллуулахад

Array:
(
    [0] => Array
        (
            [0] => photo.jpg
            [1] => image.jpeg
            [2] => picture.png
            [3] => logo.gif
        )

    [1] => Array
        (
            [0] => photo
            [1] => image
            [2] => picture
            [3] => logo
        )

    [2] => Array
        (
            [0] => jpg
            [1] => jpeg
            [2] => png
            [3] => gif
        )

)

тохирол гарч байна.

Regex-ийн горимууд

Дараах дөрвөн горим байдаг юм байна.

  • /i Үсгийн том жижгийг ялгахгүй
  • /s Нэг мөртэй горим. Энэ горимд шинэ мөрийн эхлэлийг . цэгээр илэрхийлнэ.
  • /m Олон мөрт горим. Энэ горимд ^ тэмдэгт мөрийн эхлэлийг $ долларын тэмдэг мөрийн төгсгөлийг заана.
  • /x Хэв доторх сул зайг хэрэгсэхгүй.

Эдгээрээс жишээ болгон /i горимыг PHP хэлний хувьд хэрэглэж үзье. 

<?php
   $text = 'photo.jpg
              image.JPEG
              picture.png
              logo.gif
              archive.zip';
   $pattern = '([a-z]+)\.(jpe?g|png|gif)';
   $mode = '/i';
   preg_match_all('/' . $pattern . $mode, $text, $matches);
   print_r($matches);
?>

Үр дүн нь

Array
(
    [0] => Array
        (
            [0] => photo.jpg
            [1] => image.JPEG
            [2] => picture.png
            [3] => logo.gif
        )

    [1] => Array
        (
            [0] => photo
            [1] => image
            [2] => picture
            [3] => logo
        )

    [2] => Array
        (
            [0] => jpg
            [1] => JPEG
            [2] => png
            [3] => gif
        )

)

гэж гарч байна.