A-AA+then

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

1,445
คือผมอยู่กลุ่มเดียวกับ วริษฐา ครับ
คือผมสงสัยเกี่ยวกับการใช้งานคำสั่ง 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];
}
?>


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

22 ความคิดเห็น

ถ้าจะเรียนรู้กันจริงๆ ก็ต้องเรียนรู้เกี่ยวกับ 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("เลว","ไม่ราบรื่น","มีปัญหา","ไม่สวยหรู","ขัดแย้ง","สับสน","ท้อ","เครียด","แห้ว","เสีย","เจ็บใจ","อุทาหรณ์","ใจร้อน","แย่","ห่วย","ผิดพลาด","มั่ว","โมโห","ไม่ชอบ","ไม่มีคุณภาพ","ข้อเสีย","เรียนยาก","จบยาก","ด้อย","วอกแวก","อคติ","เบื่อ","แพง","เซง","โกง","กะหรี่","ตาถั่ว","คิดผิด","สาด","แดรก","ห่า","xxx","สัส","พล่าม","ตูด","เบื่อ","บ่อนทำลาย","แคบ","อันธพาล","ด่า","เหรี้ย","โหด","xxx","แมร่ง","อีห่า","โง่","เด็กเสี่ย","ผับ","บาร์","ใจแตก","กระหรี่","เยด","ดอ","ไม่ดี","สกปรก","แคบ","อโคจร","ลำบาก","ลึก","แสด") ;
    $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
^