Regular Expression คืออะไร มารู้จักกับคำสั่ง Regular Expression กันดีกว่า


🕑 22 ม.ค. 2562
Regular Expression คืออะไร มารู้จักกับคำสั่ง Regular Expression กันดีกว่า

คำสั่ง Regular Expressions มีอยู่ในทุกภาษาแต่วันนี้จะมาแนะนำการเขียนและตัวอย่าง Regular Expressions ในภาษา php และ JavaScript กัน

เท่าที่แอดมินทำงานด้านการเขียนเว็บไซต์มา regular expression มีความสำคัญมากเว็บทุกเว็บที่แอดมินเขียนต้องเอา regular expression มาใช้แก้ปัญหาอยู่บ่อยครั้ง ถ้าเขียน regular expressionไม่เป็นคงจบงานส่งเว็บให้ลูกค้าไม่ได้แน่นอน!!! 

 

Regular Expressions คืออะไร ? 🤔

Regular Expressions คือเงื่อนไขหรือรูปแบบ(pattern) ที่เรากำหนดขึ้นมาเพื่อค้นหาข้อความหรือตัวอักษรที่เราต้องการว่าตรงตามเงื่อนไขหรือรูปแบบ(pattern) ที่เรากำหนดไว้หรือไม่

Regular Expressions มีอยู่ในทุกภาษา Programming แต่จะคำสั่งในรัน Regular Expressions นั้นจะแตกต่างกันออกไป เช่น

ในภาษา JavaScript จะใช้คำสั่ง test รันคำสั่ง regular Expressions

//ค้นหาคำว่า football ใน string
var pattern = /football/;
pattern.test("The Thailand national football team");

/* 
output >> true
*/

ในภาษา PHP คำสั่งที่เกี่ยวกับ Expressions อยู่หลายคำสั่ง เช่น preg_match

<?php
//ค้นหาคำว่า football ใน string
$pattern='/football/';
$str='The Thailand national football team';
preg_match($pattern, $str , $matches);
print_r($matches);

/*
output :

Array
(
    [0] => football
)
*/
?>
 

ตัวอย่างการนำ Regular Expressions ไปใช้

  1. เช็คความถูกต้องในฟอร์มต่างๆ เช่น เช็คค่าว่าง เช็ค email, เช็คหมายเลขโทรศัพท์, เช็ค password ว่ามีทั้งตัวเลขและตัวอักษรหรือเปล่า เป็นต้น
  2. ค้นหาคำ ในหน้านั้นๆ หรือ Find & Replace ค้นหาและทำการเปลี่ยนแปลงค่า
  3. ป้องกันไม่ให้ผู้ใช้ป้อนคำต้องห้ามต่างๆ เช่น เช็คคำหยาบ
  4. ใช้เขียนเช็ครูปแบบ url ในไฟล์ .htaccess เป็นต้น ตัวอย่างการใช้ Regular Expressions ในไฟล์ htaccess https://httpd.apache.org/docs/2.4/rewrite/intro.html

 

สัญลักษณ์

ความหมาย

 .ตัวอักษรอะไรก็ได้
 [  ]

bracket expression(เครื่องหมายก้ามปู) คือกลุ่มของตัวอักษรอักษรที่ต้องการตรวจสอบ

สามารถใช้ – ช่วยในกรณีที่ต้องการระบุเป็นช่วงของตัวอักษรเช่น

[a-zA-Z0-9] เป็นต้น

 [^  ]ไม่เอาตัวอักษรใน bracket expression
 ^ต้องขึ้นประโยคด้วยคำนี้ ห้ามมีอะไรนำหน้า ( ^ ที่อยู่ใน [] คนละความหมายกัน)
 $ต้องจบประโยคด้วยคำนี้ ห้ามมีอะไรต่อท้าย
( )กลุ่มคำที่ตรงกับเงือนไข
 |เงือนไขหรือ เช่น a|b คือตัวอักษร a หรือ b ก็ได้

สัญลักษณ์

ความหมาย

\w

ทุกๆ ตัวอักษรและ underscore

\W

ที่ไม่ใช่ตัวอักษร

\a[A-Za-z]
\s

ค้นหา whitespace(ช่องว่าง, tab, newline, carriage return, vertical tab) 

\_s[ \t\r\n\v\f] (space กับ tab และ whitespace ทุกตัว)
\S

ที่ไม่ใช่ whitespace

\d

ตัวเลขทุกตัว

\D

ที่ไม่ใช่ตัวเลข

\l[a-z] (lowercase character)
\u[A-Z] (uppercase character)
\x[A-Fa-f0-9] (Hexadecimal digits)

สัญลักษณ์

ความหมาย

 ? “มี ได้ 1 ตัว” หรือ “ไม่มี” ก็ได้
 *“มีกี่ตัวก็ได้” หรือ “ไม่มีก็ได้”
 +ต้องมีอย่างน้อย 1 ตัว
 {min,max}ในปีกา{ } มีได้ตั้งแต่ min ตัวถึง max ตัว

 

  • {2}  คือมีได้ 2 ตัวอักษรเท่านั้น 
  • {9,12}  คือมีได้ตั้งแต่ 9 – 12 ตัวอักษร
  • {8,} คือต้องมีอย่างน้อย 8 ตัวอักษรขึ้นไป

สัญลักษณ์และความหมายฉบับภาษาอังกฤษดูได้จากลิงค์นี้เลย >> 

การสร้าง Regular Expression

บทความนี้จะแนะนำการเขียน regular expressions ในภาษา javascript และ php 😁

Regular Expressions ในภาษา PHP คำสั่งที่มีการใช้บ่อยๆมีดังนี้

  1. preg_​match_​all()
  2. preg_​match()
  3. preg_​replace()
  4. preg_​split()

flag ต่างๆ ที่สำคัญ เช่น

  • /i : case sensitive เราสามารถกำหนดว่าจะหาข้อมูลแบบ case sensitive หรือไม่

Regular Expressions ในภาษา JavaScript

flag ต่างๆ ที่สำคัญ เช่น

  • /i : case sensitive เราสามารถกำหนดว่าจะหาข้อมูลแบบ case sensitive หรือไม่
  • /g : global เพื่อให้ match ทั้งหมด ไม่เฉพาะตัวแรกเท่านั้น

การสร้าง Regular Expressions ใน JavaScript ทำได้ 2 แบบคือ

1. สร้างโดยใช้เครื่องหมาย // หรือ //g (global)
let re = /[abc]/;
re.test('a') // true
2. RegExp Object
let re = new RegExp('[abc]');

re.test('a') // true

ต่อมาก็มีดูตัวอย่างการเขียน Regular Expressions กันเลย

ตัวอย่างที่ (1) เช็คว่ามีตัว "T" อยู่ในข้อความหรือเปล่า

php

preg_match('/T/', 'The Thailand national football team', $matches);
print_r($matches);
/*
Array
(
    [0] => T
)
*/

JavaScript

var re = /T/;
re.test('thailand')
/*
output >> false
*/

var re = /T/i;
re.test('thailand')
/*
output >> true
*/

 

ตัวอย่างที่ (2) เช็คว่ามีตัวอย่างน้อย 1 ตัวอยู่ในข้อความหรือเปล่า โดย "." แทนตัวอักษร และ "+" มีค่าเท่ากับอย่างน้อย 1 ตัว

PHP

<?php
preg_match('/.+/','', $matches);
print_r($matches);

/*
output :
Array()
*/

preg_match('/.+/','test', $matches);
print_r($matches);

/*
output :
Array
(
    [0] => test
)
*/

JavaScript

var re = /.+/;
re.test('');

/* output >> false */

var re = /.+/;
re.test('fgf');

/* output >> true */

 

ตัวอย่างที่ (2)  รูปแบบของ Regular Expression :   ^[0-9].{3,}

ความหมายคือข้อความต้องขึ้นต้นด้วยตัวเลขและตามด้วยตัวอักษรอย่างน้อย 3 ตัว

^ แทนความหมายว่า ขึ้นต้น
[0-9] แทนความหมายว่า ตัวเลข 0-9
แทนความหมายว่า ตัวอักษรอะไรก็ได้
{3,} แทนความหมายว่า อย่างน้อย 3 ตัว

PHP

<?php
preg_match('/^[0-9].{3,}/','Regular Expression Tutorial', $matches);
print_r($matches);
/*
output :
Array
(
)
*/


preg_match('/^[0-9].{3,}/','1.Regular Expression Tutorial', $matches);
print_r($matches);
/*
output :
Array
(
    [0] => 1.Regular Expression Tutorial
)
*/

JavaScript

var str = /^[0-9].{3,}/;
str.test('naruto vs sasuke');
//output >> false

var str = /^[0-9].{3,}/;
str.test('1.naruto vs sasuke');
//output >> true

 

ตัวอย่างที่ (3)  รูปแบบของ Regular Expression :  ^\D\s+(cc)$

ความหมายคือข้อความต้องไม่ขึ้นต้นด้วยตัวเลขจากนั้นต้องตามด้วยข่องว่างและตามด้วยตัว cc และลงท้ายตัว cc

^ แทนความหมายว่า ขึ้นต้น
\D แทนความหมายว่า ตัวเลข 0-9
\s แทนความหมายว่า ตัวอักษรอะไรก็ได้
(cc) แทนความหมายว่า ต้องมีตัวอักษร cc สองตัวติดกัน
$ แทนความหมายว่า ลงท้าย

PHP

<?php

preg_match('/^\D\s+(cc)$/','1.XXcc', $matches);
print_r($matches);

/*
output :
Array
(
)
*/

preg_match('/^\D\s+(cc)$/','XXcc', $matches);
print_r($matches);
/*
output :
Array
(
)
*/

preg_match('/^\D\s+(cc)$/','X cc', $matches);
print_r($matches);
/*
output :
Array
(
    [0] => X cc
    [1] => cc
)
*/

 

JavaScript

var str = /^\D/;
str.test('1.naruto vs sasuke');
//output >> false
var str = /^\D/;
str.test('naruto vs sasuke');
//output >> true

 

ตัวอย่างที่ (4)  รูปแบบของ Regular Expression :  ^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$

รูปแบบของ Regular Expression ใช้ในการเช็คชื่อ email ว่าถูกต้องหรือเปลา

รูปแบบของ Regular Expression ด้านบนหมายความว่า ต้องขึ้นต้นด้วยลุ่มของตัวอักษร a-z A-Z , ตัวเลข 0-9 ,_(underscore),หรือเครื่องหมาย -(ขีดกลาง) อย่างน้อย 1 ตัว แล้วตามด้วยตัวอักษร @  และตามด้วยกลุ่มของตัวอักษร a-z A-Z , ตัวเลข 0-9 ,_(underscore),หรือเครื่องหมาย -(ขีดกลาง) อย่างน้อย 1 ตัว แล้วตามด้วยเครื่องหมาย (.) และลงท้ายด้วยตัวอักษร a-z A-Z อย่างน้อย 2ตัว แต่ไม่เกิน 5 ตัว

*** เนื่องจากจุด "." เป็นสัญลักษณ์ใน Regular Expression ดังนั้นถ้าในข้อความเราต้องการเช็คว่ามีจุดหรือเปล่าต้องใช้เครื่องหมาย "\" นำหน้าเครื่องหมายจุด "."

PHP

<?php
preg_match('/^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$/','text @gmail.com', $matches);
print_r($matches);
/*
output :
Array
(
)
*/

preg_match('/^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$/','text@gmail.com', $matches);
print_r($matches);

/*
output :
Array
(
    [0] => text@gmail.com
    [1] => text
    [2] => gmail
    [3] => com
)
*/

JavaScript

var re = /^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$/;
re.test('text @gmail.com');
//output >> false

var re = /^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$/;
re.test('text@gmail.com');
//output >> true

 

แนะนำเว็บที่ใช้สำหรับทดสอบเขียน Regular Expression
  1. https://www.regextester.com/
  2. https://regexr.com/
  3. https://pythex.org/
  4. https://rubular.com/

 

แจก source code Regular Expression

สุดท้ายนี้ขอปิดท้ายด้วยการแจก function สำหรับภาษา php ที่มีการใช้ Regular Expression ร่วมด้วยลองเอาไปประยุกต์ใช้กันดูน่ะจ๊ะ

function get_attr_html($attr_name,$str){
            @preg_match( '@'.$attr_name.'="([^"]+)"@' , $str, $match );
            if(count($match)!=0){
                return ($match[1]);
            }else{
                return '';
            }
}
function parse_youtube_url($str)
{
    preg_match("/(?:http(?:s)?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?&\"'>]+)/", $str, $matches);
    $v_return='';
    if(isset($matches[1]))
    {
        $v_return=$matches[1];
    }
    return $v_return;
}
function parse_vimeo_url($str)
{
		preg_match("/https?:\/\/(?:www\.)?vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/([^\/]*)\/videos\/|album\/(\d+)\/video\/|)(\d+)(?:$|\/|\?)/", $str, $matches);
    $v_return='';
    if(isset($matches[3]))
    {
        $v_return=$matches[3];
    }
    return $v_return;
}

 

สุดุท้ายนี้ก็ขอให้ทุกคนสนุกกับการเขียนโปรแกรมน่ะจ๊ะ...😘 บ๊ายบาย

เทพควิช-lnwquiz