ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น

ThaiSEOBoard.comพัฒนาเว็บไซต์Programmingเรื่อง Regular Expression ครับ ช่วยทีคร๊าบ
หน้า: [1] 2  ทั้งหมด   ลงล่าง
พิมพ์
ผู้เขียน หัวข้อ: เรื่อง Regular Expression ครับ ช่วยทีคร๊าบ  (อ่าน 5693 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
UnzO
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 54
ออฟไลน์ ออฟไลน์

กระทู้: 1,872



ดูรายละเอียด เว็บไซต์
« เมื่อ: 22 พฤศจิกายน 2007, 17:19:23 »

อยากจะให้เช็คว่าในข้อความมันมีภาษาไทยอยู่รึป่าวหน่ะครับ ขอแค่ ตัวอักษรในภาษาไทยแค่ตัวเดียว ก็พอแล้วครับ ผมเขียนแบบนี้ แต่มันเช็คไม่ได้ ก็งง เหมือนกันคับ
โค๊ด:
ereg("[ก-๙]","$title")
* EThaiZone ขอแก้หัวกระทู้หน่อยนะครับ พิมพ์ผิด
« แก้ไขครั้งสุดท้าย: 22 พฤศจิกายน 2007, 17:54:40 โดย EThaiZone » บันทึกการเข้า
EThaiZone
เจ้าพ่อโลลิค่อน
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 321
ออฟไลน์ ออฟไลน์

กระทู้: 12,518



ดูรายละเอียด เว็บไซต์
« ตอบ #1 เมื่อ: 22 พฤศจิกายน 2007, 17:55:47 »

ใช้ [\xA1-\xF9] แทนครับ
หมายถึง ascii ตัวที่ 161 ถึง 249 (แต่นี้เป็นเลขฐาน 16 นะ)
ดูอ้างอิงจาก Editplus ได้ครับ

ยกตัวอย่างอันนี้ละกัน  จากกระทู้คุณ joe อิๆ

$var = '<img src="อยากได้ข้อมูลที่อยู่ตรงนี้">
<a href="อยากได้ข้อมูลddที่อยู่ตรงนี้"</a>';

preg_match_all('#[\xA1-\xF9]#', $var, $match);

print_r($match);
บันทึกการเข้า

UnzO
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 54
ออฟไลน์ ออฟไลน์

กระทู้: 1,872



ดูรายละเอียด เว็บไซต์
« ตอบ #2 เมื่อ: 22 พฤศจิกายน 2007, 18:19:51 »

ขอบคุณมากคับ ทำได้แล้วคับ แต่มันก็มีปัญหาอีกเช่นกันคือ ในเนื้อหาที่ผมจะเช็คเนี้ย มันมีทั้ง ภาษา ญี่ปุ่น เกาหลี จีน และ ภาษาอื่นๆ ทั่วโลกครับ ทีนี้ปัญหามันก็คือ มันมองเห็นตัวหนังสืออื่นๆ ที่ไม่ใช่ ภาษาอังกฤษ เป็น จริงหมด ดูจาก Code นะครับ

โค๊ด:
	if(ereg("[\xA1-\xF9]","$title")){
$status = "1";
}else{
$status = "0";
}

คือถ้ามีภาษาอื่น ปนมา มันจะให้ค่า $status เป็น 1 หมดเลยครับ Tongue
บันทึกการเข้า
EThaiZone
เจ้าพ่อโลลิค่อน
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 321
ออฟไลน์ ออฟไลน์

กระทู้: 12,518



ดูรายละเอียด เว็บไซต์
« ตอบ #3 เมื่อ: 22 พฤศจิกายน 2007, 18:29:59 »

ถูกต้องครับ เป็นแบบนั้น เพราะมันเป็นการตรวจ Ascii ครับ

ตอนนี้ผมเองก็คิดได้ กำลังวิจัย (เรียกซะหรู)
เกี่ยวกับการเช็คค่าในสภาพกรณีถ้ามาใช้ UTF-8 อยู่ครับ
เพราะมันได้รับทุกภาษา แถมไม่มีการปนของอักษรด้วย (แต่ในเชิงลึก ปนกันนั่วเนีย 555+)

กำลังคิดว่า อาจต้องเล่น มัลติไบต์

เล่นยากจริงๆ พับผ่าสิ  Grin
บันทึกการเข้า

EThaiZone
เจ้าพ่อโลลิค่อน
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 321
ออฟไลน์ ออฟไลน์

กระทู้: 12,518



ดูรายละเอียด เว็บไซต์
« ตอบ #4 เมื่อ: 22 พฤศจิกายน 2007, 18:41:48 »

โย่ว วิจัยเสร็จ เอ้ย ค้นคว้า..  อะไรก็แล้วแต่ (ใกล้บ้า)

preg_match_all('#[ก-๙]#u', $var, $match);


คือใช้ฟังค์ชั่นตระกูลที่รับ PCRE (ฟังค์ชั่นชื่อขึ้นต้นด้วย preg)

วิธีคือ ทำใน editplus พิมพ์ภาษาไทยกะตัวเลขปกติ
เซฟเป็น utf-8(สำคัญ)

แล้วเวลาเขียน regex ต้องมี u ต่อท้ายตัว delimiter เพื่อให้รองรับ unicode เหมือนกับตัวอย่างต้องท้าย # (สำคัญ)

เท่านี้ก็เสร็จโจร  Smiley

(วิธีหักดิบแบบบ้านๆ เหอๆ)
บันทึกการเข้า

UnzO
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 54
ออฟไลน์ ออฟไลน์

กระทู้: 1,872



ดูรายละเอียด เว็บไซต์
« ตอบ #5 เมื่อ: 22 พฤศจิกายน 2007, 23:46:55 »

เย้ ทำได้แล้วครับ ^^  ได้รับการช่วยเหลือจาก คุณ โจ้ EthaiZone ของเรานี้เอง  Grin
เผื่อเพื่อนๆ อยากรู้นะคับ ผมจะเปิดโปงโค๊ด (พูดซ๊ะ 555)

โค๊ด:
if(preg_match("#[ก-๙]#u","$title")){
$status ="0";
}else{
$status ="1";
}

จากโค๊ดด้านบน จะได้ว่า ถ้า String ที่ตรวจสอบ มี ก-๙ คือ รวมทั้ง สระ ด้วย จะให้ค่าเป็นจริงทำวงเล็บแรก ถ้าไม่เช่นนั้น จะได้เป็นเท็จ ทำวงเล็บสอง
ทั้งนี้ทั้งนั้น การตรวจสอบนี้ จะตรวจสอบจากค่าที่เป็น Encode แล้ว(ค่าที่คนมองเห็นแล้วรู้เรื่อง) คือ ไม่ได้ตรวจจากค่า ASCII(ค่าที่คนไม่รู้เรื่องแต่คอมอ่านออก) ดังนั้น ตัวหนังสือ จากภาษาอื่นๆ จะไม่เกี่ยว

ปล. ผมเข้าใจตามนี้นะครับ ถ้าผมอธิบายผิด ก็ช่วยแก้ให้ด้วยน๊าคร๊าบบ  ตอนนี้ก็ทำได้ตามที่คิดไว้แล้ว ยังไงก็ขอบคุณ คุณโจ้ อีกทีครับ  Cry
« แก้ไขครั้งสุดท้าย: 22 พฤศจิกายน 2007, 23:48:56 โดย UnzO » บันทึกการเข้า
Dr.K
Verified Seller
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 436
ออฟไลน์ ออฟไลน์

กระทู้: 6,819



ดูรายละเอียด เว็บไซต์
« ตอบ #6 เมื่อ: 22 พฤศจิกายน 2007, 23:51:29 »

ขอบคุณมากครับ ได้อะไรเนียนๆมาอีกแระ
 Grin
บันทึกการเข้า

EThaiZone
เจ้าพ่อโลลิค่อน
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 321
ออฟไลน์ ออฟไลน์

กระทู้: 12,518



ดูรายละเอียด เว็บไซต์
« ตอบ #7 เมื่อ: 23 พฤศจิกายน 2007, 00:39:00 »

หลักๆ จะอยู่ที่การเซฟชนิด encoding ของไฟล์นั้นๆ ด้วยครับ

อย่าลืมด้วย หุๆ  Tongue
บันทึกการเข้า

Tee++;
โปรแกรมเมอร์ จอหงวน
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 79
ออฟไลน์ ออฟไลน์

กระทู้: 1,861



ดูรายละเอียด เว็บไซต์
« ตอบ #8 เมื่อ: 23 พฤศจิกายน 2007, 00:47:27 »

เออ เจ๋งๆ ความรู้ใหม่ เก็บๆ
บันทึกการเข้า

myong1
สมุนแก๊งเสียว
*

พลังน้ำใจ: 33
ออฟไลน์ ออฟไลน์

กระทู้: 569



ดูรายละเอียด
« ตอบ #9 เมื่อ: 23 พฤศจิกายน 2007, 11:20:06 »

เยี่ยมมากเลยครับ คุณ EThaiZone  Smiley
บันทึกการเข้า
BosnoS
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 222
ออฟไลน์ ออฟไลน์

กระทู้: 8,168



ดูรายละเอียด
« ตอบ #10 เมื่อ: 26 พฤศจิกายน 2007, 21:37:09 »

เย้ ทำได้แล้วครับ ^^  ได้รับการช่วยเหลือจาก คุณ โจ้ EthaiZone ของเรานี้เอง  Grin
เผื่อเพื่อนๆ อยากรู้นะคับ ผมจะเปิดโปงโค๊ด (พูดซ๊ะ 555)

โค๊ด:
if(preg_match("#[ก-๙]#u","$title")){
$status ="0";
}else{
$status ="1";
}

จากโค๊ดด้านบน จะได้ว่า ถ้า String ที่ตรวจสอบ มี ก-๙ คือ รวมทั้ง สระ ด้วย จะให้ค่าเป็นจริงทำวงเล็บแรก ถ้าไม่เช่นนั้น จะได้เป็นเท็จ ทำวงเล็บสอง
ทั้งนี้ทั้งนั้น การตรวจสอบนี้ จะตรวจสอบจากค่าที่เป็น Encode แล้ว(ค่าที่คนมองเห็นแล้วรู้เรื่อง) คือ ไม่ได้ตรวจจากค่า ASCII(ค่าที่คนไม่รู้เรื่องแต่คอมอ่านออก) ดังนั้น ตัวหนังสือ จากภาษาอื่นๆ จะไม่เกี่ยว

ปล. ผมเข้าใจตามนี้นะครับ ถ้าผมอธิบายผิด ก็ช่วยแก้ให้ด้วยน๊าคร๊าบบ  ตอนนี้ก็ทำได้ตามที่คิดไว้แล้ว ยังไงก็ขอบคุณ คุณโจ้ อีกทีครับ  Cry

ลองทำแล้ว ไม่ว่าจะใส่ ไทย หรือ eng ออก $status ="1"; หมดเลย

รู้สึกผมจะมีปัญหากับ editplus แน่ๆ เลย
บันทึกการเข้า
BosnoS
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 222
ออฟไลน์ ออฟไลน์

กระทู้: 8,168



ดูรายละเอียด
« ตอบ #11 เมื่อ: 26 พฤศจิกายน 2007, 22:23:34 »

สรุปแล้ว script ดีทุกอย่างเลย

ผมพลาดเอง ดันเอา ตัวแปล ไปผ่านคำสั่ง แปลงเป็น urlencode ผลลัพท์เลยเพี้ยน
บันทึกการเข้า
hurahura
สมุนแก๊งเสียว
*

พลังน้ำใจ: 20
ออฟไลน์ ออฟไลน์

กระทู้: 868



ดูรายละเอียด
« ตอบ #12 เมื่อ: 08 มีนาคม 2008, 19:15:06 »

ขอบคุณมากครับ มันยอดมากเลย

แล้วทีนี้ถ้าจะเช็คจำนวนตัวอักษร จะทำยังไงครับ ถ้าคำที่ใส่เข้ามามีทั้งภาษาไทยและอังกฤษ
บันทึกการเข้า
ball6847
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 212
ออฟไลน์ ออฟไลน์

กระทู้: 4,174



ดูรายละเอียด
« ตอบ #13 เมื่อ: 08 มีนาคม 2008, 20:11:45 »

เ็ห็นพูดถึง regular expression กัน ตอนผมศึกษาเรื่องนี้อยู่ผมหาโน่นหานี่มาอ่านบานเลย (แต่ยังอ่านไปได้ไม่เท่าไหร่เองง่ะ)

แต่มีเล่มนึงผมว่ามีประโยชน์ เป็น Regular Expression Pocket Referrence เป็นคู่มืออ้างอิงของ Regex น่ะแหล่ะ แถมสำหรับหลายภาษาด้วย ลองเอาไปอ่านกันดูนะ

และก็มีโปรแกรม Regex Buddy เป็นโปรแกรมที่ผมเอาไว้ทดลอง เวลาหัดใช้อ่ะ

2 อันนี้ผมแพ็ครวมกันไว้ให้แระ โหลดเอาโลด ประมาณ 8 เม็ก

โค๊ด:
http://upload.mthai.com/F1/47d29104d55e3

เรียนกันหนุกๆนะคับ
บันทึกการเข้า

EThaiZone
เจ้าพ่อโลลิค่อน
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 321
ออฟไลน์ ออฟไลน์

กระทู้: 12,518



ดูรายละเอียด เว็บไซต์
« ตอบ #14 เมื่อ: 10 มีนาคม 2008, 09:01:02 »

ขอบคุณมากครับ มันยอดมากเลย

แล้วทีนี้ถ้าจะเช็คจำนวนตัวอักษร จะทำยังไงครับ ถ้าคำที่ใส่เข้ามามีทั้งภาษาไทยและอังกฤษ

ไม่ใช้ strlen ล่ะครับ ??
บันทึกการเข้า

kudjung
สมุนแก๊งเสียว
*

พลังน้ำใจ: 45
ออฟไลน์ ออฟไลน์

กระทู้: 985



ดูรายละเอียด เว็บไซต์
« ตอบ #15 เมื่อ: 12 มีนาคม 2008, 15:57:21 »

ถามต่อนะครับ ถ้าจะดึงข้อมูลที่อยู่ใน <body></body> ออกมาำไงครับ เพราะถ้าเจอบรรทัดใหม่มันก็ไม่ได้แล้วเช่น
<body>12345</body>อันนี้ดึงได้แต่ถ้า
<body>

12345

</body>
อันนี้ไม่ได้อะครับ
บันทึกการเข้า

thenetxx
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 41
ออฟไลน์ ออฟไลน์

กระทู้: 1,986



ดูรายละเอียด เว็บไซต์
« ตอบ #16 เมื่อ: 12 มีนาคม 2008, 16:34:02 »

โค๊ด:
$txt = ' <body>

detail

</body>';

$txt = str_replace(array('\n','\r'),'',$txt);


ก็น่าจะพอมั้งคับ
บันทึกการเข้า

Develop site but can't develop life
ASIA
ball6847
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 212
ออฟไลน์ ออฟไลน์

กระทู้: 4,174



ดูรายละเอียด
« ตอบ #17 เมื่อ: 12 มีนาคม 2008, 19:19:10 »

ถามต่อนะครับ ถ้าจะดึงข้อมูลที่อยู่ใน <body></body> ออกมาำไงครับ เพราะถ้าเจอบรรทัดใหม่มันก็ไม่ได้แล้วเช่น
<body>12345</body>อันนี้ดึงได้แต่ถ้า
<body>

12345

</body>
อันนี้ไม่ได้อะครับ

โค๊ด:
<?php

$html 
''// your html contents

$pattern "|<body>(.*)</body>|s"// mode 's' means dot (.)  matches all newline characters (\n)
preg_match$pattern $html $match );

$bodyContent $match[1];

echo 
$bodyContent;


?>


เติิม mode s เข้าไปเพื่อบอก PHP ให้นับเครื่องหมายจุด (.) กับบรรทัดใหม่ด้วย ปกติเครื่องหมายจุด . จะนับแค่ whitespace คับ แต่จะไม่นับ newline character (\n) ด้วย เติม s เข้าไปหลัง pattern ก็โอเคแล้วครับ
บันทึกการเข้า

kudjung
สมุนแก๊งเสียว
*

พลังน้ำใจ: 45
ออฟไลน์ ออฟไลน์

กระทู้: 985



ดูรายละเอียด เว็บไซต์
« ตอบ #18 เมื่อ: 12 มีนาคม 2008, 19:35:30 »

ถามต่อนะครับ ถ้าจะดึงข้อมูลที่อยู่ใน <body></body> ออกมาำไงครับ เพราะถ้าเจอบรรทัดใหม่มันก็ไม่ได้แล้วเช่น
<body>12345</body>อันนี้ดึงได้แต่ถ้า
<body>

12345

</body>
อันนี้ไม่ได้อะครับ

โค๊ด:
<?php

$html 
''// your html contents

$pattern "|<body>(.*)</body>|s"// mode 's' means dot (.)  matches all newline characters (\n)
preg_match$pattern $html $match );

$bodyContent $match[1];

echo 
$bodyContent;


?>


เติิม mode s เข้าไปเพื่อบอก PHP ให้นับเครื่องหมายจุด (.) กับบรรทัดใหม่ด้วย ปกติเครื่องหมายจุด . จะนับแค่ whitespace คับ แต่จะไม่นับ newline character (\n) ด้วย เติม s เข้าไปหลัง pattern ก็โอเคแล้วครับ

โอ้ว เยี่ยมครับ ขอบคุณมากๆ เลย
บันทึกการเข้า

hurahura
สมุนแก๊งเสียว
*

พลังน้ำใจ: 20
ออฟไลน์ ออฟไลน์

กระทู้: 868



ดูรายละเอียด
« ตอบ #19 เมื่อ: 17 มีนาคม 2008, 16:46:06 »

ขอบคุณมากครับ มันยอดมากเลย

แล้วทีนี้ถ้าจะเช็คจำนวนตัวอักษร จะทำยังไงครับ ถ้าคำที่ใส่เข้ามามีทั้งภาษาไทยและอังกฤษ

ไม่ใช้ strlen ล่ะครับ ??

ถ้าเป็น ภาษาไทย UTF-8 มันนับ 3 อ่ะครับ
แต่ทำได้ละครับ ให้แปลงไปเป็น tis620 ก่อน แล้วถึงหาจำนวนตัวอักษร แล้วค่อยแปลงกลับ

โค๊ด:
function utf8totis620($string) {
  $str = $string;
  $res = "";
  for ($i = 0; $i < strlen($str); $i++) {
    if (ord($str[$i]) == 224) {
      $unicode = ord($str[$i+2]) & 0x3F;
      $unicode |= (ord($str[$i+1]) & 0x3F) << 6;
      $unicode |= (ord($str[$i]) & 0x0F) << 12;
      $res .= chr($unicode-0x0E00+0xA0);
      $i += 2;
    } else {
      $res .= $str[$i];
    }
  }
  return $res;
}

function tis2utf8($tis) {
   for( $i=0 ; $i< strlen($tis) ; $i++ ){
      $s = substr($tis, $i, 1);
      $val = ord($s);
      if( $val < 0x80 ){
         $utf8 .= $s;
      } elseif ( ( 0xA1 <= $val and $val <= 0xDA ) or ( 0xDF <= $val and $val <= 0xFB ) ){
         $unicode = 0x0E00 + $val - 0xA0;
         $utf8 .= chr( 0xE0 | ($unicode >> 12) );
         $utf8 .= chr( 0x80 | (($unicode >> 6) & 0x3F) );
         $utf8 .= chr( 0x80 | ($unicode & 0x3F) );
      }
   }
   return $utf8;
}

$name = utf8totis620($name);
echo strlen($name);
$name = tis2utf8($name);

ถ้ามีวิธีดีกว่านี้ แนะนำด้วยครับ

ปล. โค้ดแปลงไปมาระหว่าง tis620 กับ utf8 เอามาจากในเน็ต แต่จำไม่ได้เอามาจากเว็บไหน แต่ใช้ได้ผล
« แก้ไขครั้งสุดท้าย: 17 มีนาคม 2008, 16:48:44 โดย hurahura » บันทึกการเข้า
หน้า: [1] 2  ทั้งหมด   ขึ้นบน
พิมพ์