ทบทวนการตัดข้อความด้วย PHP

เขียนเมื่อ 15 ปีก่อน โดย Ninenik Narkdee
แยกตัวอักษร อักษรซ้ำ ตัดตัวซ้ำ แยกข้อความ ตัดข้อความ ตัดตัวอักษร ข้อความ php

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ แยกตัวอักษร อักษรซ้ำ ตัดตัวซ้ำ แยกข้อความ ตัดข้อความ ตัดตัวอักษร ข้อความ php

ดูแล้ว 77,773 ครั้ง


เมื่อต้องการตัดข้อความบางส่วนออกจากข้อความต้นฉบับ สามารถใช้ฟังก์ชัน substr() ของ PHP ในการตัดข้อความ ดังนี้

การใช้งาน

substr ( string string, int start [, int length] )

โดยคำสั่ง substr() จะส่งกลับค่าส่วนของข้อความ string ที่กำหนดจุดเริ่มต้น start และ จำนวนความยาวที่ต้องการ length

ตัวอย่างการใช้งานกรณี start มีค่าไม่เป็นลบ

<?php 
$rest = substr("abcdef", 1);    // returns "bcdef" 
$rest = substr("abcdef", 1, 3); // returns "bcd" 
$rest = substr("abcdef", 0, 4); // returns "abcd" 
$rest = substr("abcdef", 0, 8); // returns "abcdef" 
?>

ตัวอย่างการใช้งานกรณี start มีค่าติดลบ จะเริ่มนับจากด้านหลังของข้อความเข้ามา เช่น -3 หมายถึงเริ่มจากตัวที่ 3 โดยนับจากด้านหลังข้อความ

<?php 
$rest = substr("abcdef", -1);    // returns "f" เริ่มนับจากตัว f
$rest = substr("abcdef", -2);    // returns "ef" เริ่มนับจากตัว e
$rest = substr("abcdef", -3, 1); // returns "d" เริ่มนับจากตัว d
?>

ตัวอย่างกรณีถ้าค่า start มากกว่า ความยาวของข้อความต้นฉบับ จะส่งค่ากลับเป็น FALSE

<?php 
$rest = substr("abcdef", 8,4);   
 // returns FALSE ข้อความยาวแค่ 6 ตัวอักษร
// แต่ค่า start เป็น 8 มากกว่าความยาวของค่าความจึงส่งค่ากลับมาเป็น FALSE
?>

กรณีค่า length มีค่าเป็นบวก หมายถึงจำนวนข้อความที่ต้องการตัดเท่ากับค่า length นั้นๆ

กรณีค่า length มีค่าเป็นลบ หมายถึงการระบุตำแหน่งสุดท้ายของข้อความที่ต้องการ โดยตัดข้อความที่นับจากด้านหลังออก เช่น -1 หมายถึงนับจากตัวสุดท้ายมา 1 ตัวให้ตัดออกไป

ตัวอย่างกรณีค่า length มีค่าเป็นลบ

<?php 
$rest = substr("abcdef", 0, -1);  // returns "abcde" 
// ตัดข้อความจากตัวแรก a ไปจนถึง ตัว e โดยตัดข้อความที่นับจากหลังมา 1 ตัวออกไป
$rest = substr("abcdef", 2, -1);  // returns "cde" 
$rest = substr("abcdef", 4, -4);  // returns "" 
$rest = substr("abcdef", -3, -1); // returns "de" 
?>
กรณีตัดข้อความที่เป็นภาษาไทยแล้วแสดงเป็นสัญลักษณ์แปลกๆ ให้ใช้คำสั่ง mb_substr() แทน
โดยรูปแบบการใช้งานก็จะคล้ายๆ กับ substr() 
ตัวอย่าง
 
<?php
$text = "วันนี้ทดสอบบบ";
echo mb_substr($text,0,-2);
// จะได้ผลลัพธ์เป็น "วันนี้ทดสอบ"
?>


   เพิ่มเติมเนื้อหา ครั้งที่ 1 วันที่ 19-10-2017


เราสามารถใช้คำสั่ง str_split() เพื่อแยกตัวอักษรแต่ละตัวในข้อความได้ โดยจะคืนค่าเป็น array
เช่น
 
$text = "This is a test";
$arr_char = str_split($text);
print_r($arr_char);
 
ผลลัพธ์ที่ได้
 
Array
(
    [0] => T
    [1] => h
    [2] => i
    [3] => s
    [4] =>  
    [5] => i
    [6] => s
    [7] =>  
    [8] => a
    [9] =>  
    [10] => t
    [11] => e
    [12] => s
    [13] => t
)
 
สามารถกำหนด การแยกทีละ กี่ตัวอักษรก็ได้ เช่นแยกทีละ 3 ตัว
 
$text = "This is a test";
$arr_char = str_split($text,3);
print_r($arr_char);
 
ผลลัพธ์ที่ได้
 
Array
(
    [0] => Thi
    [1] => s i
    [2] => s a
    [3] =>  te
    [4] => st
)
 
สังเกตว่า จะรวมช่องว่างนับเข้าไปด้วย  
วิธีการแยกตัวอักษรจากวิธีข้างต้น โดยใช้คำสั่ง str_split() ไม่สามารถใช้งานได้ กับการแยก
ตัวอักษรภาษาไทย แต่เราสามารถใช้ คำสั่ง preg_match_all() สำหรับกรณีภาษาไทย ได้ดังนี้
 
$text = "ภาษาไทย";
preg_match_all('/./u',$text,$arr_char);
print_r($arr_char);
 
ผลลัพธ์ที่ได้
 
Array
(
    [0] => Array
        (
            [0] => ภ
            [1] => า
            [2] => ษ
            [3] => า
            [4] => ไ
            [5] => ท
            [6] => ย
        )

)
 
คำสั่ง preg_match_all() ข้างต้นคือ ค้นหาจากการเปรียบเทียบ regular expression โดยใช้
/./u เทียบกับข้อความในตัวแปร $text ซึ่ง . คือ ตัวอักษรใดๆ ส่วน u คือการระบุให้อยู่ในรูปแบบ 
UTF-8 ซึ่งสำคัญสำหรับกรณีภาษาไทย 
โดยเมื่อได้ตัวอักษรแต่ละตัวก็เอาไปเก็บในตัวแปร array ที่ชื่อ $arr_char
 


   เพิ่มเติมเนื้อหา ครั้งที่ 2 วันที่ 23-10-2017


การตัดตัวอักษรซ้ำ ตัวอักขระซ้ำ อักษรที่เกินให้เหลือตัวเดียว

 
แนวทางคำสั่งต่อไปนี้ ใช้สำหรับการแทนที่ตัวอักษรหรือตัวอักขระ ที่พิมพ์ติดๆ กันซ้ำ ซึ่งง
อาจจะเกิดจากการพิมพ์ผิดพลาดหรือเหตุผลใด ตัวอย่างเช่น
 
ทดสอบบบบ
 
เราจะเห็นว่าคำว่า "สอบ" มีตัว "บ" ซ้ำมาถึง 4 ตัว เราต้องการจะให้แสดงแค่ตัวเดียวจะทำอย่างไร
นอกจากนี้ แนวทางที่จะแนะนำยังประยุกต์ได้ดังนี้
  • ถ้ามีตัวซ้ำมากกว่า 1 ตัวขึ้นไป 
  • ถ้ามีตัวซ้ำมากกว่า n ตัวขึ้นไป
 
การประยุกต์แรก ตัวซ้ำมากกว่า 1 ตัวขึ้นไป
 
<?php
$text = "วันนี้ทดสอบบบ";
$text = preg_replace('/(.)\1+/u','$1',$text);
echo $text;
// จะได้เป็น "วันี้ทดสอบ"
 
จะเห็นว่ากรณีแรกจะใช้ได้ผลเฉพาะบางคำ และปกติไม่ค่อยใช้เท่าไหร่ เพราะโอกาส ที่ตัวอักษรจะติด
กันอย่างน้อยสองตัว เป็นไปได้เสมอในหลายๆ คำ ดังนั้นตัวอย่างข้างต้น คำว่า "ทอสอบ" จะแสดงได้
ถูกต้อง แต่คำว่า "วันนี้" กลับตัดเหลือแค่ "วันี้" ซึ่งยังไม่ถูกต้อง  เราจึงใช้วิธีที่สอง
 
เงื่อนไขคือซ้ำกันสองตัวไม่ต้องตัด ซ้ำกันเกินสองตัวให้ตัดเหลือตัวเดียว จะได้เป็น
 
<?php
$text = "วันนี้ทดสอบบบ";
$text = preg_replace('/(.)\1{2,}/u','$1',$text);echo $text;
echo $text;
// จะได้เป็น "วันนี้ทดสอบ"
 
จะเห็นว่าคำว่า "วันนี้" มี "น" ติดกันแค่สองตัว จึงไม่ตัดเหลือตัวเดียว
ในขณะที่คำว่า "ทดสอบบบ" มี "บ" ติดกันเกินสองตัว จัดตัดเหลือตัวเดียว
 
หากเราต้องการประยุกต์โดยเพิ่มเงื่อนไขเช่นว่า มากกว่า 3, 4 หรือ n ตัว แล้วให้ตัดเหลือตัวเดียว
ก็ให้เปลี่ยนตัวเลขเป็นตามจำนวนที่ต้องการเช่น สมมติ มากกว่า 3 ตัวหรือเท่ากับ 4 ตัวขึ้นไปก็
จะใช้เป็น
 
<?php
$text = "ววววันนี้ทดสอบบบบ";
$text = preg_replace('/(.)\1{3,}/u','$1',$text);echo $text;
echo $text;
 
 


กด Like หรือ Share เป็นกำลังใจ ให้มีบทความใหม่ๆ เรื่อยๆ น่ะครับ











URL สำหรับอ้างอิง





คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
  • เปลี่ยน


    ( หรือ เข้าใช้งานผ่าน Social Login )







เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ