PHP เบื้องต้น > การควบคุมข้อความและนิพจน์ปกติี่
การทำงานกับข้อความ
PHP มีหลายฟังก์ชันในการควบคุมและประมวลผลข้อความ รวมทั้งมีหลายฟังก์ชันได้รับการ overload เมื่อเปิดโมดูล mbstring สำหรับ multi-byte
การดึงสารสนเทศ
PHP มีฟังก์ชันจำนวนหนึ่งในการดึงสารสนเทศของข้อความ ได้แก่ ความยาวและตำแหน่งภายในชุดตัวอักษร
ฟังก์ชัน strlen (mb_strlen)
ฟังก์ชัน strlen () สามารถตรวจสอบความยาวของข้อความด้วยการนับตัวอักษร
strlen("กุหลาบ สายประดิษฐ์ เจ้าของนามปากกา ศรีบูรพา");
ข้อความนี้นับได้ 43 ตัวอักษร
mb_strlen() มีตัวเลือกการเข้ารหัสมีไวยากรณ์คือ
int mb_strlen(string input, string encode);
encode คือ การเข้ารหัส เช่น UTF-8
ฟังก์ชัน mb_detect_encoding
ฟังก์ชัน mb_detect_encoding() ใช้วิเคราะห์การเข้ารหัสข้อความ และเป็นประโยชน์มากเมื่อทำงานกับภาษาญี่ปุ่น หรือรัสเซีย
<?php
$mystring = "Hello world";
echo mb_detect_encoding($mystring);
?>
ผลลัพธ์ คือ ASCII
การเชื่อมและแบ่งข้อความด้วยฟังก์ชันข้อความ
บ่อยครั้งที่มีความต้องการดูบ่างส่วนของข้อความ ตัวอย่างเช่น อาจจะมองหาคำในประโยค (เช่น ตรวจการสะกด) หรือ แบ่งชื่อโดเมนหรือชื่ออีเมล์เป็นส่วนประกอบ ในการทำงานนี้ PHP มีหลายฟังชันข้อความ (และ 1 ฟังก์ชันนิพจน์ปกติ)
ตัวอย่าง การแจ้งกลับจาก mycustomer.com ให้ส่งข่าวสารตรงไปยังผู้บริหาร ดังนั้นต้องแบ่งชื่ออีเมล์ออกเป็นส่วนเพื่อค้นหาว่าเป็นลูกค้าตามที่ระบุหรือไม่
ฟังก์ชัน explode, implode และ join
ฟังก์ชันแรกสามารถใช้กับวัตถุประสงค์นี้ explode () มีไวยากรณ์ดังนี้
array explode (string separator, string input);
ฟังก์ชันนี้นำข้อความ input และแบ่งเป็นชิ้นส่วนตามการระบุด้วย separator ชิ้นส่วนได้รับการส่งใน array
การดึงชื่อโดเมนจากชื่ออีเมล์ในสคริปต์นี้ สามารถใช้คำสั่งต่อไปนี้
$email_array = explode ("@", $email);
คำสั่งนี้เรียก explode [1] ขณะนี้สามารถทดสอบชื่อโดเมนเพื่อหาที่มาของลูกค้า จากนั้นส่งข่าวสารให้กับบุคคลที่เหมาะสม
<?php
$email = array();
$email = array("wandee@mycustomer.com", "chaiwat@widebase.net");
foreach ($email as $msg)
{
$email_array = explode("@", $msg);
if ($email_array[1] == "mycustomer.com")
echo "$msg แจ้งให้ฝ่ายบริหารทราบ<br/>\n";
else
echo "$msg ลูกค้าปกติ<br/>\n";
}
?>
หมายเหตุ ถ้าโดเมนเป็นตัวพิมพ์ใหญ่จะทำงานไม่ได้ การหลีกเลี่ยงปัญหานี้ให้แปลงชื่อโดเมนเป็นตัวพิมพ์ใหญ่ หรือตัวพิมพ์เล็กทั้งหมด จากนั้นจึงตรวจสอบ
$email_array[1] = strtoupper($email_array [1]);
การย้อนกลับผลของ explode () ใช้ได้ทั้ง implode () หรือ join() ซึ่งเหมือนกับตัวอย่าง
$new_email = implode ("@", $email_array)
คำสั่งนี้นำหน่วยข้อมูลของ array จาก $email_array และเชื่อมเข้าด้วยกันด้วยข้อความส่งผ่านในพารามิเตอร์แรก การเรียกคล้ายกับ explode () แต่มีผลต่างกัน
ฟังก์ชัน substr
ฟังก์ชัน substr () ยอมให้เข้าถึงข้อความย่อยระหว่างจุดเริ่มต้นและสิ้นสุดของข้อความ ฟังก์ชันนี้สามารถใช้ประโยชน์เมื่อต้องการบางส่วนของข้อความตายตัว
ฟังก์ชัน substr () มีไวยากรณ์ต่อไปนี้
string substr (string string, int start, int [length]);
ฟังก์ชันนี้ส่งออกสำเนาข้อความย่อยจากภายใน string
ตัวอย่าง
$test = "การให้บริการลูกค้าของท่านดีเยี่ยม"
ถ้าเรียกฟังก์ชันด้วยตัวเลขจำนวนมากสำหรับ start (มีเฉพาะ start ) จะได้ข้อความจาก start ไปยังสิ้นสุดข้อความ
substr($test, 1);
ส่งออก"การให้บริการลูกค้าของท่านดีเยี่ยม"
หมายเหตุ ตำแหน่งเริ่มต้นข้อความเริ่มจาก 0 และด้วย array
ถ้าเรียก substr () ด้วยตัวเลขจำนวนลบสำหรับ start ( มีเฉพาะ start ) จะได้ข้อความจากท้ายของข้อความลบด้วยตัวอักษรจำนวน start ไปยังสิ้นสุดข้อความ ตัวอย่าง
substr($test, -8);
ส่งออก "ดีเยี่ยม"
พารามิเตอร์ length สามารถใช้ระบุได้ทั้งจำนวนตัวหนังสือส่งออก (ถ้าเป็นค่าบวก) หรือตัวอักษรสุดท้ายของลำดับส่งออก (ถ้าเป็นค่าลบ) ตัวอย่าง
substr($test, 0, 6);
ส่งออก 6 ตัวอักษรแรกของข้อความคือ "การให้" คำสั่งต่อไป
substr($test, 6, -15);
ส่งออกตัวอักษรระหว่างตัวอักษรที่ 4 ถึงตัวที่ 15 จากตัวอักษรสุดท้าย คือ "บริการลูกค้า"
การค้นหาและเปรียบเทียบข้อความ
ในการประยุกต์ทั่วไปมีโอกาสในการค้นหาข้อความย่อยภายในข้อความใหญ่ เช่น การค้นหารายชื่อหนังสือ ด้วยคีย์เวิร์ดของหัวข้อ บทความบนเว็บหนังสือพิมพ์
ฟังก์ชัน strstr
การค้นหาข้อความภายในอีกข้อความสามารถใช้ฟังก์ชัน strstr (), strchr (), strrchr () หรือ stristr()
ฟังก์ชัน strstr () มีลักษณะทั่วไปมากที่สุดและสามารถใช้ค้นหาข้อความหรือตัวอักษรที่ตรงกับภายในข้อความยาวกว่า ใน PHP ฟังก์ชัน strchr () เหมือนกับ strstr () ถึงแม้ว่าชื่อมีนัยยะว่าใช้ค้นหาตัวอักษรในข้อความเหมือนกับภาษา C ใน PHP ฟังก์ชันเหล่านี้สามารถใช้ค้นหาข้อความภายในข้อความ รวมถึงการค้นหาข้อความที่เก็บเพียง 1 ตัวอักษร
ไวยากรณ์ของ strstr () คือ
string strstr (string haystack, string needle);
ส่งผ่าน haystack สำหรับการค้นหา และค้นด้วยข้อความ needle ถ้าตรงกับ needle ฟังก์ชันนี้ส่งออก haystack จาก needle ต่อไป กรณีอื่นส่งออก FALSE ถ้า needle ปรากฏมากกว่า 1 ครั้ง ข้อความส่งออกจะเริ่มต้นจาก needle ที่ปรากฏครั้งแรก
<?php
//
// strstr function
$mystring = "Your customer service is excellent";
if (strstr($mystring, "service"))
$dept = "services";
else if (strstr($mystring, "shop"))
$dept = "retail";
else if (strstr($mystring, "bill"))
$dept = "account";
else
$dept = "customer relation";
echo $dept."<br/>\n";
?>
คำสั่งนี้ตรวจสอบคีย์เวิร์ดในข่าวสารตอบกลับและเลือกบุคคลที่เกี่ยวข้อง ถ้าในตัวอย่างการตอบกลับของลูกค้าคือ "Your customer service is excellent." เมื่อพบข้อความ "service" แผนกที่เกี่ยวข้องคือ "services" โดย haystack ส่งออกคือ"service is excellent"
strstr () มี 2 อนุพันธ์ อนุพันธ์แรกคือ stristr () ซึ่งใกล้เคียงมากแต่ต่างกันที่ตัวพิมพ์ไม่มีผล ฟังก์ชันนี้มีประโยชน์สำหรับโปรแกรมประยุกต์ เมื่อลูกค้าอาจจะป้อนข้อความเป็น "service", "Service" หรือ "SERVICE"
อนุพันธ์ที่ 2 คือ strrchr () ซึ่งใกล้เคียงมาก แต่ส่งออก haystack จาก needle ครั้งสุดท้าย
ฟังก์ชัน strpos (mb_strpos) และ strrpos (mb_strrpos)
ฟังก์ชัน strpos (mb_strpos) และ strrpos (mb_strrpos) ทำงานคล้ายกับ strstr() ยกเว้นแทนที่การส่งออกข้อความย่อย แต่ส่งออกตัวเลขตำแหน่งของ needle ภายใน haystack
ฟังก์ชัน strpos () มีไวยากรณ์คือ
int strpos (string haystack, string needle, int [offset]);
ตัวเลขจำนวนเต็มส่งออกแสดงตำแหน่งการปรากฏครั้งแรกของ needle ภายใน haystack ตัวอักษรแรกมีตำแหน่งเป็น 0
ตัวอย่าง การใช้ฟังก์ชัน strpos
<?php
//
// strpos function
$mystring = "กุหลาบ สายประดิษฐ์ เจ้าของนามปากกา ศรีบูรพา";
// ค้นหาตัวอักษร
$pos1 = strpos($mystring,"ร");
// ค้นหาข้อความย่อย
$pos2 = strpos($mystring, "เจ้า");
// ค้นหาตัวอักษร เริ่มจาก 15
$pos3 = strpos($mystring, "ร", 15);
// ค้นหาด้วย mb_strpos
$mbpos = mb_strpos($mystring, "ร");
echo "strpos, mb_strpos function<br/>\n";
echo "\$pos1: $pos1 \$pos2: $pos2 \$pos3: $pos3 \$mbpos: $mbpos <br/>\n";
?>
ผลลัพธ์
$idx1: 11 $idx2: 19 $idx3: 36 $mbidx: 11
needle สามารถเป็นข้อความได้ตาม $pos2
พารามิเตอร์ตัวเลือก offset ได้รับการใช้เพื่อระบุตำแหน่งภายใน haystack สำหรับการเริ่มต้นค้นหา
$pos3 = strpos($mystring, "ร", 15);
คำสั่งนี้จะพิมพ์ค่า 36 ไปยัง browser เพราะ PHP เริ่มต้นมองหา "ร" จากตำแหน่งที่ 15 ดังนั้นไม่เห็นอีกตัวที่ตำแหน่งที่ 11
สำหรับ mb_strpos() มีประโยชน์กับภาษาจีน ญี่ปุ่น และเกาหลีมากกว่าภาษาไทย
ฟังก์ชัน strrpos() เกือบเหมือนกันแต่จะส่งออกตำแหน่งที่ปรากฏสุดท้ายของ needle ใน haystack ฟังก์ชันนี้ต่างจาก strpos () ทำงานเฉพาะด้วยตัวอักษรเดียวของ needle ดังนั้นถ้าส่งผ่านข้อความในฐานะ needle จะใช้เฉพาะตัวอักษรแรกของข้อความที่ค้นหา
ในกรณีอื่น ถ้า needle ไม่ใช่ข้อความ strpos () หรือ strrpos () จะส่งออก FALSE สิ่งนี้สามารถเกิดปัญหาเพราะ FALSE ในภาษาที่มีประเภทข้อมูลอ่อนแอ เช่น PHP จะเทียบเท่ากับ 0 นั่นเป็นตัวอักษรแรกในข้อความ
การหลีกเลี่ยงปัญหาใช้ = = operator เพื่อทดสอบค่าส่งออก
$pos = strpos($mystring, "ก");
if ($pos === FALSE)
echo "ไม่พบ";
else
echo "พบที่ตำแหน่ง 0";
หมายเหตุ วิธีการนี้ทำงานเฉพาะใน PHP4 และเวอร์ชันต่อมา ในเวอร์ชันก่อนหน้านี้ สามารถทดสอบ FALSE โดยการทดสอบค่าส่งออกเพื่อดูว่าเป็นข้อความหรือไม่
ฟังก์ชัน strcmp และ strnmp
ฟังก์ชัน strcmp () เปรียบเทียบข้อความด้วยไบต์ ( จึงสามารถค้นหาข้อความที่มีตัวอักษรไบนารีพิมพ์ไม่ได้) และตัวพิมพ์มีผล โดยส่งออก 3 ค่า
- -1 ชี้ว่าข้อความแรก "เล็กกว่า" ข้อความที่ 2
- 0 ชี้ว่าข้อความนี้เท่ากัน
- 1 ชี้ว่าข้อความแรก "ใหญ่กว่า" ข้อความที่ 2
ฟังก์ชัน strcmp () มีจำกัดในการเปรียบเทียบค่าไบต์เพื่อพิจารณา "ใหญ่กว่า" และ "เล็กกว่า" ตามค่าในตารางตัวอักษร ตัวพิมพ์เล็กมีตัวเลขน้อยกว่าตัวพิมพ์ใหญ่ หมายความว่า "z" น้อยกว่า "A"
ไวยากรณ์สำหรับ strcmp () คือ
int strcmp ( string str1, string str2);
ฟังก์ชัน strncmp () เหมือนกับ strcmp () ยกเว้นใช้เปรียบเทียบ n ตัวอักษรแรกข้อความได้ด้วยการส่งผ่านพารามิเตอร์ที่ 3
<?php
// strcmp เปรียบเทียบตัวพิมพ์ ลำดับตัวอักษร
$str1 = "Rat";
$str2 = "rat";
$str3 = "Cat";
$cmpa = strcmp($str1, $str2);
$cmpb = strcmp($str2, $str3);
echo "1. strcmp> \$cmpa: $cmpa, \$cmpb: $cmpb <br/>\n";
// strncmp เปรียบเทียบ 3 ตัวอักษร
$str1 = "แม่น้ำเจ้าพระยา";
$str2 = "แม่จัน";
$cmpn = strncmp($str1, $str2, 3);
echo "2. strncmp: $cmpn <br/>\n";
?>
ผลลัพธ์
1. strcmp> $cmpa: -1, $cmpb: 1
2. strncmp: 0
ฟังก์ชัน strcasecmp () เหมือนกับ strcmp() และ ฟังก์ชัน strncasecmp () เหมือนกับ strncmp() ยกเว้นตัวพิมพ์ไม่มีผล
ฟังก์ชัน strnatcmp () และ strnatcasecmp () ฟังก์ชันคู่นี้ตัวพิมพ์ไม่มีผล ได้รับการเพิ่มใน PHP4 ฟังก์ชันนี้เปรียบเทียบข้อความตาม "ลำดับธรรมชาต" ซึ่งใกล้เคียงกับการใช้ของคน ตัวอย่าง strcmp() จัดลำดับข้อความ "2" มากกว่าข้อความ "12" เพราะใหญ่กว่า strnatcmp() ทำในอีกวิธีหนึ่งตามพจนานุกรม
การแทนที่ข้อความย่อย
การแทนที่ข้อความมีประโยชน์กับการประยุกต์เว็บบอร์ด สมุดเยี่ยม ที่เปิดโอกาสบุคคลทั่วไปแสดงความเห็น ในบางครั้งอาจจะมีการใช้คำไม่เหมาะสม
ฟังก์ชัน str_replace และ substr_replace
ฟังก์ชัน str_replace () และ substr_replace () สามารถค้นหาและแทนที่ โดยสามารถใช้กับข้อความ ในเอกสารที่สร้างโดย PHP ตัวอย่าง การแทนที่ <<province>> ด้วยชื่อจังหวัด และ <<address>> ด้วยที่อยู่
ในวัตถุประสงค์นี้ สามารถใช้ฟังก์ชันข้อความหรือนิพจน์ปกติ
ส่วนใหญ่การแทนที่ใช้ str_replace () และมีไวยากรณ์ คือ
string str_replace (string needle, string new_needle, string haystack);
ฟังก์ชันนี้จะแทนที่ instance ทั้งหมดของ needle ใน haystack ด้วย new_needle
<?php
$mystring =<<<TESTSTRING
เราต้องช่วยเหลือชุมชนของเรา
เราต้องร่วมมือร่วมใจพัฒนาชุมชน
เราจึงจะอยู่ด้วยกันอย่างมีความสุข
TESTSTRING;
$repalce = "เรา";
$replaceby = "เขา";
$newstring = str_replace($repalce, $replaceby, $mystring);
echo nl2br($newstring);
?>
ผลลัพธ์
เขาต้องช่วยเหลือชุมชนของเขา
เขาต้องร่วมมือร่วมใจพัฒนาชุมชน
เขาจึงจะอยู่ด้วยกันอย่างมีความสุข
ตัวอย่าง ลูกค้าหรือผู้เยี่ยมชมที่แสดงความเห็นบนสมุดเยี่ยมบนอินเตอร์เน็ตของบริษัท ในการตำหนิ บางครั้งอาจจะมีการใช้คำหยาบ ซึ่งไม่เหมาะสมกับการปรากฎบนพื้นที่สาธารณะ
$comment = str_replace($replace, "!^",$comment);
substr_replace () ใช้ในการค้นหาและแทนที่เฉพาะข้อความย่อยในข้อความโดยมีไวยากรณ์ คือ
string substr_replace (string string, string replacement, int start, int [length]);
ฟังก์ชันนี้จะแทนที่ส่วนของข้อความ string ด้วยข้อความ replacement ส่วนใดที่ถูกแทนที่ขึ้นกับค่าของ start และพารามิเตอร์ตัวเลือก length
|