GORAGOD.com

freelance, web developer, web designer, hosting, domain name

ขอความช่วยเหลือเกี่ยวกับการตัดคำครับ

คือผมอยู่กลุ่มเดียวกับ วริษฐา ครับ

คือผมสงสัยเกี่ยวกับการใช้งานคำสั่ง preg_match

ครับคือผมพยายามอ่านจากเว็บของ php แล้วก็ยังไม่เข้าใจอยู่ดีครับย

คือคำสั่งนี้สามารถที่จะ get คำที่อยู่ ระหว่างกลาง คำที่เราเลือกได้ไหมครับ

เช่น คำว่า "(i)love<you"
แล้วเรา เลือกคำว่า (i)  กับ คำว่า <you

เพื่อให้ระบบ เก็บคำว่า love อย่างนี้น่ะครับ

คล้ายๆกับตัวอย่างนี้น่ะครับ






<?php

// get host name from URL

preg_match('@^(?:http://)?([^/]+)@i',

    
"http://www.php.net/index.html"$matches);

$host $matches[1];



// get last two segments of host name

preg_match('/[^.]+\.[^.]+$/'$host$matches);

echo 
"domain name is: {$matches[0]}\n";

?>







ที่เขาสามารถดึงแค่ www.php.net โดยตัด http:// กับ /index.html น่ะครับ

ผมคิดว่าน่าจะนำมาประยุกต์ใช้กับโปนเจกต์ของผมได้



แล้วก็อยากให้อธิบายโค้ดชุดนี้ด้วยครับ

<?php

if (preg_match('/.*<body>(.*)<\/body>.*/isu'), $html, $match) {

  // print_r($match);

  echo $match[1];

}

?>



ขอบพระคุณเป็นอย่างสูงเลยครับ


01 ก.ย. 2553 22 2,604

ถ้าจะเรียนรู้กันจริงๆ ก็ต้องเรียนรู้เกี่ยวกับ regular expression ครับ ซึ่งบอกตามตรงว่าเป็นเรื่องที่ยากเอาการ เนื่องจากมีกฏเยอะ และประยุกต์ใช้ได้หลากหลาย แต่ถ้าใช้เป็นหรือพอเป็นก็ช่วยได้เยอะครับ



จากคำถาม .*<body>(.*)<\/body>.*



.* หมายถึงตัวอักษรตัวใดก็ได้มากว่า 1 ตัว

() ในที่นี้คือผลลัพท์ที่เราต้องการ

\/ เพราะ / เป็นตัวอักษรควบคุมจึงต้องมี \ นำหน้า



ความหมายของมันก็ตรงๆแหละครับ ตัวอักษรใดๆก็ได้ที่อยู่ระหว่าง body



ส่วนการตัดคำอย่างที่เธอต้องการ ผมว่าในทางปฏิบัติค่อนข้างยาก เนื่องจากหากเธอต้องการคำไหนเธอต้องเขียนคำสั่งเป็นรายคำไป เช่น ต้องการ body ก็ต้องเขียนคำสั่งของ body ต้องการ love ก็ต้องไปเขียนคำสั่งเฉพาะของ love เป็นต้น และถ้ามีหลายๆ คำล่ะ คำสั่งมิยาวเป็นหางว่าวแล้วก็ช้าหรอกเหรอ



สำหรับเทคนิคโดยทั่วๆไปที่ SE ใช้เขาจะไม่ใช้วิธีนี้ครับ เนื่องจากมันไม่มีประสิทธิภาพ ผมยกตัวอย่างเช่น

1.ใช้การตัดคำที่ สั้นๆ ออกก่อน

2.ตัดสัญลักษณ์ ซึ่งไม่มีความหมายออกก่อน (รวมถึง tag รูปภาพ หรืออะไรที่ไม่ใช่ข้อความ)

3.สนใจแต่คำที่มากกว่า 1 หรือ 2 ตัวอักษร เช่น i หรือ am ไม่ต้องไปสนใจมัน

4.ตัดคำต่างๆ ตามช่องว่างที่เหลือ



นอกจากนี้อาจใช้วิธีลิสต์รายการข้อความที่สนใจออกมาจำนวนหนึ่งก็ได้ ถ้าสามารถหาได้หมด แล้วทำการเปรียบเทียบเฉพาะคำที่สนใจ (แบบเดียวกับการตัดคำของ Browser)
#1

ขอบคุณคร้าบ

แต่ที่ ผมลองมาทำ ตัวแปลที่ว่า $html คือ สตริงที่ดูดมาเก็บไว้ใช้ไหมครับ?

ผมลองแล้วมัน error



Parse error: syntax error, unexpected ',' in C:\xampp\htdocs\pj\dud.php on line 23



คือ if (preg_match('/.*<body>(.*)<\/body>.*/isu'), $html, $match) {



อยู่ที่บรรทัดที่ 23 พอดีอ่ะครับ
#2

ลองดูรูปแบบการเขียนตามด้่านบนดูครับ
#3


ผมทราบแล้วครับว่า error ตรงไหน ตรงที่ ( มันอยู่ผิดที่

พอแก้แล้วกลายเป็น



$content = file_get_contents($add);







if (preg_match('/.*<body>(.*)<\/body>.*/isu', $content, $match)) {


  // print_r($match);


  echo $match[1];


}else {


echo "<br> not front";


}





แต่ว่าผลลัพธ์มันก็ กลายเป็น not front ทุกทีเลยครับ

#4

ลอง echo เอา content ออกมาดูก่อนสิครับว่า ข้อมูลถูกต้องหรือเปล่า



ปล. วิธีการที่ให้เป็นเพียงแนวทาง ในทางปฏิบัติ tag body อาจมี attribute ก็ได้ ซึ่งอาจต้องเพิ่มเติมความสามารถอื่นๆตามนั้นด้วย (ซึ่งต้องพึ่งพาความรู้เกี่ยวกับ regular expresion)
#5

ลองแล้วครับ มันก็จะได้หน้าเว็บที่ไม่มีรูปภาพออกมา

นอกจากนั้น... ผมยังลองทั้ง

ค้นหาคำ นับอักษร ในตัวแปล conten มันทำได้หมดครับ

จนผมค่อนข้างแน่ใจว่ามัน สตริงครับ



ผมลองใช้คีย์ อื่นค้นหาแล้วครับ

อย่างเว็บ pantip ผมลองนั่งมองโค้ดดู และพบว่า

ก่อนที่จะเจอคำภาษาไทย ต้องมีแท็ค <!--MsgIDBody=1--> เปิด

และปิดด้วย <!--MsgFile=1--> เสมอ ครับ โดยตัวเลข จะเปลี่ยนไปตามลำดับคอมเม้นครับ

ผมก็เลยลองเอามันไปแทนตัว body ปรากฎว่าไม่เจอเช่นเดิม T^T



มีรุ่นพี่เขาแนะนำว่า ลองใช้วิธีค้นหาใน txt file ดู

ผมก็ตอบไปว่า ผมไม่ทราบวิธีการนั้น 

แล้วรุ่นพี่ก็หัวเราะ และบอกว่าไม่รู้เช่นกัน -*-



ปล. ผมชักเหนื่อยแล้วแฮะ...ยากชะมัดเลย พอมีวิธีอื

ผมก็ตอบไปว่า ผมไม่ทราบวิธีการนั้น 

แล้วรุ่นพี่ก็หัวเราะ และบอกว่าไม่รู้เช่นกัน -*-



ปล. ผมชักเหนื่อยแล้วแฮะ...ยากชะมัดเลย พอมีวิธีอื่นแนะนำไหมครับ :39:
#6

ถ้า ฟังกชั่นในกลุ่ม preg ใช้ยาก ก็ใช้ฟังก์ชั่นอื่นสิครับ เช่น strstri stripos มีหลายฟังก์ชั่นเกี่ยวกับ string ที่สามารถนำมาใช้ได้



แนวคิดก็คือ ค้นหา tag เปิด แล้วก็ค้นหา tag ปิด



เอา ปิด - เปิด ก็จะได้ตำแหน่งข้อความตรงกลางออกมา



ทำงานกับ string ถ้าไม่รู้วิธีการใช้ฟังก์ชั่นพวกนี้ก็อาจจะยากหน่อยแหละครับ ซึ่งในความเป็นจริง อาจมีอีกหลายวิธี ขึ้นกับความถนัดของผู้ใช้



ปล. ถึงยังไงฟังก์ชั่นในกลุ่ม preg ก็มีประสิทธิ์ภาพดีที่สุดครับ แต่มันค่อนข้างใช้ยาก ถ้ายังพอมีเวลา ผมแนะนำให้ลองศึกษาดูครับ ซึ่งแหล่งข้อมูลที่ดีที่สุดก็ที่ php.net ครับ



อ้อ ตัวอักษรที่เห็นบน Browser บางตัวเช่น < อาจเป็น &gt; ก้ได้นะครับ ซึ่งมันอาจทำให้เราหลงทาง
#7

แต่ละเว็บมันใส่ tag มิเหมือนกันหรอกครับนอกเสียจากเราจะเจาะจงเป็นเว็บๆ ไปในการไปเก็บ content มาใช้งาน
#8


อ้างอิงจาก ความคิดเห็น #8แต่ละเว็บมันใส่ tag มิเหมือนกันหรอกครับนอกเสียจากเราจะเจาะจงเป็นเว็บๆ ไปในการไปเก็บ content มาใช้งาน


ใช่ครับ

ผมเจาะจงแค่เว็บบอร์ดของเว็บ พันทิพ เด็กดี และ วิชาการ.คอม  เท่านั้นเหละครับ

ผมคิดอีกวิธีนึงออกแล้วครับ

เด๋วทดลองใช้งานดูก่อน

นั่นคือการใช้ explode ตัดเว็บช่วงๆ ตัดทั้ง หมด 3 ครั้ง 

แต่ก็เจอปัญหาอยู่ดี

มันมีวิธีมี่เก็บ ตัวเครื่องหมาย ""

ใส่ในตัวแปรได้ไหมครับ

อย่างเช่น



$a = " he said "I Love YOU"";



มันจะเก็บแค่ he said เฉยๆรึเปลาครับ


#9

explode ก็ยังมีข้อควรระวังนะครับ เพราะอาจมีคำว่า body นอกจาก tag มันก็ได้



ก็ใช้วิธีดียวกันกับการตัด tag แหละครับ
#10

อ่าครับ ขอบคุณสำหรับข้อคิดครับ

ตอนนี้ตัดได้เป็นความเห็นๆ แล้ว

กำลังทำในส่วนค้นหา ชื่อหมาวิทยาลัยอยู่

พอจะมีวิธีอะไรเสนอ แนะไหมครับ

ผมคิดว่าผมจะทำโดยใช้ if else เอา แต่ต้องลองก่อน อ่ะครับ
#11

คำแนะนำคือ เลือกใช้วิธีที่ถนัด และเข้าใจครับ(ถ้ามี) จะทำให้งานเดินไปได้ง่ายๆ



การค้นหาคำทั่วไปก็ stripos() ครับ ใช้วิธีวนลูปค้นหาชื่อวิทยาลัยที่รู้จักที่ละชื่อ
#12

โหยตอบเร็วมวาก

ขอบคุณครับ

ผมลองใช้ if else โค้ดยาวมาก

เด๋วลองวิธี  stripos ดูครับ



ขอบคุณมากๆเลยครับ เด๋วติดอีก เด๋วมาถามอีก
#13

เอ่อ มีปัญหาแล้วครับ

ผมคิดว่าจะใช้ฟังก์ชั่นตัดคำหยาบ ในการนับคำที่ดี และ ไม่ดี

แต่มันใช้ไม่ได้อ่ะครับ ไม่รู้ทำไม แต่มันไม่ยอมเป็นตามเงื่อนไขเลย

โดยผมใช้โค้ด ตามนี้ครับ





<?php


$b = "ความรักเรารับ สวยงามและราบรื่นอยู่ใช่ไหม?";


echo $b,"<br>";


$summ = checkWordBad($b);


echo $summ[1];


 


function checkWordBad($word){


$good = array("ราบรื่น","ไม่มีปัญหา","สวยหรู","ชัดเจน","ดี","เจ๋ง","พยายาม","อดทน","ขอบคุณ","สบายใจ","ชอบ","มั่นคง","จุดยืน","มุ่งมั่น","น่าสนใจ","เก่ง","แชมป์","น่าสนใจ","ข้อดี","ไม่เป็นไร","คนดี","อัธยาศัยดี","กว้างขวาง","สวย","ร่มรื่น","สะอาด","บริสุทธิ์","ปลอดโปร่ง","มีคุณค่า","เชื่อถือได้","มีความสามารถ","ดีงาม","กันเอง","มีคุณภาพ","มีอนาคต","มีชื่อเสียง","เจริญ") ;


$bad = array("เลว","ไม่ราบรื่น","มีปัญหา","ไม่สวยหรู","ขัดแย้ง","สับสน","ท้อ","เครียด","แห้ว","เสีย","เจ็บใจ","อุทาหรณ์","ใจร้อน","แย่","ห่วย","ผิดพลาด","มั่ว","โมโห","ไม่ชอบ","ไม่มีคุณภาพ","ข้อเสีย","เรียนยาก","จบยาก","ด้อย","วอกแวก","อคติ","เบื่อ","แพง","เซง","โกง","กะหรี่","ตาถั่ว","คิดผิด","สาด","แดรก","ห่า","เหี้ย","สัส","พล่าม","ตูด","เบื่อ","บ่อนทำลาย","แคบ","อันธพาล","ด่า","เหรี้ย","โหด","แม่ง","แมร่ง","อีห่า","โง่","เด็กเสี่ย","ผับ","บาร์","ใจแตก","กระหรี่","เยด","ดอ","ไม่ดี","สกปรก","แคบ","อโคจร","ลำบาก","ลึก","แสด") ;


$wgood = 0;


foreach ($good as $value) {


$wgood = wgood + 1;


//$word = str_replace($value,$strCensor ,$word);


}


$wbad = 0;


foreach ($bad as $value) {


$wbad = $wbad+1;


//$word = str_replace($value,$strCensor ,$word);


}


$rt = array($wgood,$wbad);


return $rt;


}


?>



ผลลัพธ์ ได้ 65 ทั้งๆ ที่น่าจะ 0

#14

ถูกต้องแล้วครับ จากฟังก์ชั่น $wgood จะนับตามจำนวนข้อความในแอเรย์ ซึ่งถามกี่ประโยค ก็คงตอบได้ค่าเดียวนี่แหละครับ



ดูตัวอย่างที่ถูกต้องนะ



<?php

   $wgood = 0; // เริ่มต้น 0 คือไม่มี

   foreach($good AS $item) { // วนลูปคำดี

     if(stripos($word,$item)){ // ค้นหาคำที่ดี

       // เจอคำค้น

       $wgood++; // เพิ่มจำนวนคำดีที่พบ

       echo $item.'<br />'; // debug แสดงผลคำดีที่พบ

     }

   }

?>
#15

ขอบคุณมากครับ

เด๋วจะลองทดลองใช้ดูนะครับ
#16

อ้างอิงจาก ความคิดเห็น #15



<?php

   $wgood = 0; // เริ่มต้น 0 คือไม่มี

   foreach($good AS $item) { // วนลูปคำดี

     if(stripos($word,$item)){ // ค้นหาคำที่ดี

       // เจอคำค้น

       $wgood++; // เพิ่มจำนวนคำดีที่พบ

       echo $item.'<br />'; // debug แสดงผลคำดีที่พบ

     }

   }

?>




ตัวแปล $item คืออะไรเหรอครับ

ผม งงๆ 
#17



$item ก็  $value ไง ตามแบบของเธอ

#18


ได้แล้วครับ

ขอบพระคุณเป็นอย่างสูงมากๆเลยครับ

อยากมีคลังคำสั่ง อยู่ในหัวเหมือนพี่มั่งจัง

จะได้เก่งๆ T^T


#19

อ้างอิงจาก ความคิดเห็น #19


ได้แล้วครับ

ขอบพระคุณเป็นอย่างสูงมากๆเลยครับ

อยากมีคลังคำสั่ง อยู่ในหัวเหมือนพี่มั่งจัง

จะได้เก่งๆ T^T




หมั่นทำบ่อยๆ ครับ และก็ หมั่นดู บ่อยๆ ด้วย โค้ดต่างๆ ดูแล้วถึงจะไม่เข้าใจในตอนแรก แต่มันอาจสะกิดต่อมเข้าใจในภายหลังได้ครับ

ผมเองก็ไม่ได้จำคำสั่งได้ทั้งหมดหรอก แต่อาศัยว่า "เหมือนเคยเห็นวิธีนี้ที่ไหน...น๊า"
#20

มีข้อสงสัยอีกแล้วครับ

คือผมเก็บคำที่ผมเจอ มาลงฐานข้อมูลแล้วครับ

แล้วทีนี้ ผมอยากให้นับคำที่ซ้ำกัน รวบไปเลยอ่ะครับเช่น



$a = ("ดี","ดี","ดีจริงๆ","ดีแล้ว","ดี","ไม่ดี","ไม่ดี","ดี","ไม่ดี","ดี",);



อยากให้ แสดงออกมาเป็นตารางว่ามีคำว่า

1. ดี   5 คำ

2.ไม่ดี 3 คำ



อะไรเทือกนี้ผม ผมพยายามคิดหาวิธีทำหัวแทบแตกแล้วครับ คิดไม่ออกเลย



รบกวนหน่อยนะครับ

ปล. ไม่อยากตั้งกระทู้ใหม่ เปลือง data base อิอิ
#21

อ้างอิงจาก ความคิดเห็น #21ปล. ไม่อยากตั้งกระทู้ใหม่ เปลือง data base อิอิ


555+++ ค่าเท่ากันแหละครับ



คำตอบของเรื่องนี้ผมเพิ่งเขียนหมาดๆ ลองดูบทความเกี่ยวกับแอเรย์ครับ
#22
ความคิดเห็น
ไฟล์อัปโหลด ชนิด jpg, jpeg ขนาดไฟล์ไม่เกิน 2M
^