[บทที่ 3]สอนเขียน PHP ดึงข่าวจาก LINE TODAY เก็บลงฐานข้อมูล Step by Step[สายเทา]

เริ่มโดย powerpc, 14 ธันวาคม 2016, 14:38:32

หัวข้อก่อนหน้า - หัวข้อถัดไป

0 สมาชิก และ 1 ผู้มาเยือน กำลังดูหัวข้อนี้

powerpc

บทที่ 2 เริ่มการตัดตอน

ในบทที่ 1 เราสามารถดึงข้อมูลจาก Line Today มาได้แล้ว ซึ่งจะอยู่ในรูปแบบของภาษา html+javascript แต่ทั้งหมดนั้นมันก็คือข้อความยาว ๆ เท่านั้นเอง
สิ่งต่อไปคือการนำข้อความที่ได้ มาตัดเอาเฉพาะส่วนที่เราต้องการ ซึ้งขันตอนนี้เราจะต้องเขียนคำสั่งในการตัดเอาส่วนที่เราต้องการจากข้อความทั้งหมดที่เรามี โดยจะตั้งชื่อว่า get_string_between() หน้าที่คือตัดเอาเฉพาะส่วนข้อความตรงกลาง จากข้อความหัวและท้ายที่เรากำหนดเข้าไป


<?php
/* old function 2016-12-14
function get_string_between($string,$start,$end){
$arr = explode($end,$string);
$arr = explode($start,$arr[0]);
return $arr[1];
}
*/

function get_string_between($string,$start,$end){
$arr explode($start,$string);
$arr explode($end,$arr[1]);
return $arr[0];
}
?>


โดย function นี้ จะทำหน้าที่ง่าย ๆ ตัวอย่างเช่น

ข้อความทั้งหมดคือ 0123456789 เราจะตัดเอาเฉพาะ 456  เราจะเอา 3 และ 7 เป็นตัวแบ่ง จะได้คำสั่งประมาณ get_string_between('0123456789','3','7');

โดยการทำงานเป็นขั้นตอนอย่างนี้
$arr = explode($end,$string); // ตัดข้อความโดยใช้ explode โดยเอา ข้อความสุดท้ายที่เราต้องการเป็นตัวแบ่ง แล้วเก็บไว้ในตัวแปร array
โดยข้อความด้านหน้าของตัวแบ่งจะอยู่ใน array ที่ 0 ข้อความที่อยู่หลังจะอยู่ array ที่ 1 (ถ้าตัวแบ่งมีหลายครั้งในข้อความ ก็จะเก็บใน array ตัวถัด ๆ ไป)

จากตัวอย่างขั้นตอนแรกเราจะได้
$arr[0] = 0123456
$arr[1] = 89

ในที่นี่เราสนใจเฉพาะ $arr[0] เพราะเป็นส่วนที่เราต้องการ เพื่อไปตัดต่อในขั้นตอนที่ 2
$arr = explode($start,$arr[0]);
ในลักษณะเดียวกัน เมื่อทำการ explode ก็จะได้
$arr[0] = 012
$arr[1] = 456
ซึ่งใน $arr[1] คือสิ่งที่เราต้องการ จึงส่งค่ากลับออกมาจาก function


โดยการทำงานเป็นขั้นตอนอย่างนี้
$arr = explode($start,$string); // ตัดข้อความโดยใช้ explode โดยเอา ข้อความเริ่มต้นที่เราต้องการเป็นตัวแบ่ง แล้วเก็บไว้ในตัวแปร array
โดยข้อความด้านหน้าของตัวแบ่งจะอยู่ใน array ที่ 0 ข้อความที่อยู่หลังจะอยู่ array ที่ 1 (ถ้าตัวแบ่งมีหลายครั้งในข้อความ ก็จะเก็บใน array ตัวถัด ๆ ไป)

จากตัวอย่างขั้นตอนแรกเราจะได้
$arr[0] = 012
$arr[1] = 456789

ในที่นี่เราสนใจเฉพาะ $arr[1] เพราะเป็นส่วนที่เราต้องการ เพื่อไปตัดต่อในขั้นตอนที่ 2
$arr = explode($end,$arr[1]);
ในลักษณะเดียวกัน เมื่อทำการ explode ก็จะได้
$arr[0] = 456
$arr[1] = 89
ซึ่งใน $arr[0] คือสิ่งที่เราต้องการ จึงส่งค่ากลับออกมาจาก function

เมื่อเราได้ function ในการตัดข้อความที่เราต้องการแล้ว ก็นำมาประกอบร่างกับบทที่ 1 แต่จะจับบทที่ 1 เข้าไปใน function โดยตั้งชื่อว่า get_contents() จะได้โค้ดดังต่อไปนี้


<?php
function get_contents($url){
$ch curl_init(); 
curl_setopt($chCURLOPT_RETURNTRANSFER1);
curl_setopt($chCURLOPT_SSL_VERIFYPEERfalse);
curl_setopt($chCURLOPT_USERAGENT,"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36");
curl_setopt($chCURLOPT_URL$url); 

$data curl_exec($ch); 
curl_close($ch);
return $data;
}

/* old function 2016-12-14
function get_string_between($string,$start,$end){
$arr = explode($end,$string);
$arr = explode($start,$arr[0]);
return $arr[1];
}
*/

function get_string_between($string,$start,$end){
$arr explode($start,$string);
$arr explode($end,$arr[1]);
return $arr[0];
}


?>


เมื่อสร้าง function ไว้แล้วก็ทำการเรียกใช้งาน โดย function get_contents() จะทำหน้าที่ดึงข้อมูลจาก url ที่เราต้องการมาให้ จากนั้นใช้ function get_string_between() มาทำการตัดเอาเฉพาะส่วนที่เราต้องการ

*** แต่ get_string_between มีข้อจำกัดอยู่ว่า คำที่จะเป็นจุด start แล้ว end จะต้องเป็นข้อความเดียวที่ปรากฏอยู่ในข้อความต้นฉบับทั้งหมด ห้ามมีซ้ำกันหลายที่ เพราะตัว get_string_between จะไปจับเอาเฉพาะคำแรกที่เจอเท่านั้น หากคำนั้นไปอยู่กลางข้อความที่เราต้องการ มันก็จะตัดเอาเฉพาะส่วนแรก

คราวนี้เราลองมาตัดเอาเฉพาะ discription ของเว็บ Line Today กันดู โดยให้เรา view source หน้า Line today ขึ้นมาดูก่อน จะได้ตามภาพ


ดังนั้นในการกำหนด คำที่จะเอามาตัดส่วนหัวและท้าย ก็ควรเป็น <meta name="description" content=" และ โดย LINE TODAY"> เพราะค้นหาแล้วไม่มีส่วนที่ซ้ำกันอีกในข้อความทั้่งหมด ดังนั้นโค้ดทั้งหมดจะเป็นดังนี้ โดยให้สร้างไฟล์ bot-02.php แล้วใส่โค้ดนี้ลงไป


<?php
function 
get_contents($url){
$ch curl_init(); 
curl_setopt($chCURLOPT_RETURNTRANSFER1);
curl_setopt($chCURLOPT_SSL_VERIFYPEERfalse);
curl_setopt($chCURLOPT_USERAGENT,"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36");
curl_setopt($chCURLOPT_URL$url); 

$data curl_exec($ch); 
curl_close($ch);
return $data;
}

function get_string_between($string,$start,$end){
$arr explode($start,$string);
$arr explode($end,$arr[1]);
return $arr[0];
}

$url "https://today.line.me/th";
$contents get_contents($url);

$text =  get_string_between($contents,"<meta name=\"description\" content=\"","โดย LINE TODAY\">");

header("Content-Type: text/html; charset=utf-8");
echo $text;
?>



จากนั้นลองรันไฟล์ bot-02.php (http://class.undergroundclass.com/linetoday/bot-02.php) จะได้ข้อความตามภาพด้านล่าง


##########################################
2016-12-15 ปรับ function get_string_between()

<?php
function get_string_between($string,$start,$end){
$arr explode($start,$string);
$arr explode($end,$arr[1]);
return $arr[0];
}
?>
[แจกฟรี] [direct=https://thai.ac]เว็บไซต์โรงเรียนสำเร็จรูป[/direct]
[แจกฟรี] [direct=https://obec.ac]เว็บไซต์ครูสำเร็จรูป[/direct]
[ตัวแทนจำหน่าย] [direct=https://lotteryonline.in.th]มังกรฟ้า [/direct] [direct=https://lotteryonline.in.th]ลอตเตอรี่ออนไลน์[/direct]

ieiq

ทำดีได้ดี เพราะทำด้วยใจ

beerqazasa


dekdoo

จาก Function ข้างบน แบบนี้

<?php
function get_string_between($string,$start,$end){
$arr explode($end,$string);
$arr explode($start,$arr[0]);
return $arr[1];
}
?>



ยกตัวอย่าง ข้อความที่ได้มาก่อนผ่าน Function คือ : 0123454678
แล้วเรียกแบบนี้
get_string_between('0123454678','3','7');
คำตอบคือได้ค่า $arr[1] = 456

ดังนั้นผมขอถามแบบนี้หน่อยครับ
ยกตัวอย่าง ข้อความที่ได้มาก่อนผ่าน Function คือ : 0130454678
แล้วเรียกแบบนี้
get_string_between('0130454678','3','7');
คำตอบคือได้ค่า ?

powerpc

อ้างถึงจาก: dekdoo ใน 14 ธันวาคม 2016, 22:45:34
จาก Function ข้างบน แบบนี้

<?php
function get_string_between($string,$start,$end){
$arr explode($end,$string);
$arr explode($start,$arr[0]);
return $arr[1];
}
?>



ยกตัวอย่าง ข้อความที่ได้มาก่อนผ่าน Function คือ : 0123454678
แล้วเรียกแบบนี้
get_string_between('0123454678','3','7');
คำตอบคือได้ค่า $arr[1] = 456

ดังนั้นผมขอถามแบบนี้หน่อยครับ
ยกตัวอย่าง ข้อความที่ได้มาก่อนผ่าน Function คือ : 0130454678
แล้วเรียกแบบนี้
get_string_between('0130454678','3','7');
คำตอบคือได้ค่า ?

แก้ไขนะครับ พิมพ์เลข 4 เกิน ตัวอย่างจะเป็น get_string_between('0123456789','3','7'); ได้ผลออกมาเป็น 456

แต่ถ้าเรียก get_string_between('0130454678','3','7');
คำตอบคือได้ค่า 04546
[แจกฟรี] [direct=https://thai.ac]เว็บไซต์โรงเรียนสำเร็จรูป[/direct]
[แจกฟรี] [direct=https://obec.ac]เว็บไซต์ครูสำเร็จรูป[/direct]
[ตัวแทนจำหน่าย] [direct=https://lotteryonline.in.th]มังกรฟ้า [/direct] [direct=https://lotteryonline.in.th]ลอตเตอรี่ออนไลน์[/direct]

dekdoo

ขอเสริมอีกนิดครับ ไม่อยากแก้ของเดิม
ถ้าค่าที่ get ได้มีการเปลี่ยนแปลงและได้เป็นดังนี้ 0133456789 จะตัดเอาค่า 456 ออกมา
คำตอบคือ = Error ถูกหรือเปล่าครับ

powerpc

อ้างถึงจาก: dekdoo ใน 14 ธันวาคม 2016, 22:54:33
ขอเสริมอีกนิดครับ ไม่อยากแก้ของเดิม
ถ้าค่าที่ get ได้มีการเปลี่ยนแปลงและได้เป็นดังนี้ 0133456789 จะตัดเอาค่า 456 ออกมา
คำตอบคือ = Error ถูกหรือเปล่าครับ
อยู่ในข้อจำกัดของ get_string_between ดังที่แจ้งไว้ครับ

อ้างถึง*** แต่ get_string_between มีข้อจำกัดอยู่ว่า คำที่จะเป็นจุด start แล้ว end จะต้องเป็นข้อความเดียวที่ปรากฏอยู่ในข้อความต้นฉบับทั้งหมด ห้ามมีซ้ำกันหลายที่ เพราะตัว get_string_between จะไปจับเอาเฉพาะคำแรกที่เจอเท่านั้น หากคำนั้นไปอยู่กลางข้อความที่เราต้องการ มันก็จะตัดเอาเฉพาะส่วนแรก
[แจกฟรี] [direct=https://thai.ac]เว็บไซต์โรงเรียนสำเร็จรูป[/direct]
[แจกฟรี] [direct=https://obec.ac]เว็บไซต์ครูสำเร็จรูป[/direct]
[ตัวแทนจำหน่าย] [direct=https://lotteryonline.in.th]มังกรฟ้า [/direct] [direct=https://lotteryonline.in.th]ลอตเตอรี่ออนไลน์[/direct]

powerpc

/// ทำไมต้อง fix ค่าที่มีแค่ครั้งเดียว อาจจะเกิด error ได้ไหม ถ้าเนื้อหาที่ดึงมามันมี่ส่วนที่เราต้องการซ้ำกัน ///

การใช้ค่า fix ก็มีข้อคำนึกแค่ว่า เราจะใช้ตัวไหน ต้องให้แน่ใจว่าเป็น static code ที่อยู่ใน html ที่ดึงมา ซึ่งถ้าไม่มีการแก้ไขโค้ดต้นฉบับ เนื้อหาที่ดึงมาก็มีโอกาศน้อยที่จะเปลี่ยนไป แต่ก็มีเหมือนกันที่เว็บต้นทางแก้ไขโค้ด เราก็ต้องแก้ไขตามไปอีกที นี่คือเส้นทางนะครับ
[แจกฟรี] [direct=https://thai.ac]เว็บไซต์โรงเรียนสำเร็จรูป[/direct]
[แจกฟรี] [direct=https://obec.ac]เว็บไซต์ครูสำเร็จรูป[/direct]
[ตัวแทนจำหน่าย] [direct=https://lotteryonline.in.th]มังกรฟ้า [/direct] [direct=https://lotteryonline.in.th]ลอตเตอรี่ออนไลน์[/direct]

powerpc

แต่หลักการที่ผมใช้นี้ ก็ทดสอบมาแล้ว ใช้งานได้ดีไม่มีการรเปลี่ยนแปลงตั้งแต่ สิงหาคม 59 แต่ก็ไม่แน่เขียนเรื่องนี้ยังไม่ทันจบอาจมีการเปลี่ยนแปลงเกิดขึ้นได้  :wanwan004:
[แจกฟรี] [direct=https://thai.ac]เว็บไซต์โรงเรียนสำเร็จรูป[/direct]
[แจกฟรี] [direct=https://obec.ac]เว็บไซต์ครูสำเร็จรูป[/direct]
[ตัวแทนจำหน่าย] [direct=https://lotteryonline.in.th]มังกรฟ้า [/direct] [direct=https://lotteryonline.in.th]ลอตเตอรี่ออนไลน์[/direct]

powerpc

จริง ๆ มี function อีกตัวหนึ่งที่ใช้งานได้ดีในการตัดคำโดยเฉพาะ ก็สามารถใช้งานได้เช่นกัน


<?php
function get_string_between($string$start$end){
        
$string " ".$string;
        
$ini strpos($string,$start);
        if (
$ini == 0) return "";
        
$ini += strlen($start);   
        
$len strpos($string,$end,$ini) - $ini;
        return 
substr($string,$ini,$len);
}
?>


โดย function นี้จะหาตำแหน่ง หัว และความยาว ถึงตัวท้าย แล้วตัดเอาโดยใช้ substr
[แจกฟรี] [direct=https://thai.ac]เว็บไซต์โรงเรียนสำเร็จรูป[/direct]
[แจกฟรี] [direct=https://obec.ac]เว็บไซต์ครูสำเร็จรูป[/direct]
[ตัวแทนจำหน่าย] [direct=https://lotteryonline.in.th]มังกรฟ้า [/direct] [direct=https://lotteryonline.in.th]ลอตเตอรี่ออนไลน์[/direct]

nongwoonsen


Sakana

ใครจะติดต่อรบกวน pm เฟสของท่านมาได้เลยครับ เดี๋ยวแอดไป

time999

[direct=https://www.bagcolor.com]บริการรับทำกระเป๋าผ้า ถุงผ้า จากโรงงานผลิตกระเป๋าผ้าโดยตรง Bagcolor[/direct]
[direct=https://www.umbrellazzz.com]ที่สุดของงานผลิตร่ม คุณภาพ กับโรงงานร่ม Umbrellazzz[/direct]
[direct=https://www.facebook.com/bagcolor]Bagcolor โรงงานกระเป๋าผ้า บริการครบวงจร รับทำกระเป๋าผ้า ขายส่งกระเป๋าผ้า ราคาถูก[/direct]

powerpc

ปรับปรุง function get_string_between() เพื่อความสวยงาม
<?php
/* old function 2016-12-14
function get_string_between($string,$start,$end){
$arr = explode($end,$string);
$arr = explode($start,$arr[0]);
return $arr[1];
}
*/

function get_string_between($string,$start,$end){
$arr explode($start,$string);
$arr explode($end,$arr[1]);
return $arr[0];
}
?>

[แจกฟรี] [direct=https://thai.ac]เว็บไซต์โรงเรียนสำเร็จรูป[/direct]
[แจกฟรี] [direct=https://obec.ac]เว็บไซต์ครูสำเร็จรูป[/direct]
[ตัวแทนจำหน่าย] [direct=https://lotteryonline.in.th]มังกรฟ้า [/direct] [direct=https://lotteryonline.in.th]ลอตเตอรี่ออนไลน์[/direct]

Nasir

หลงรักเพชรบุรี
https://longrakphetchaburi.com

thaigopher

รับปรึกษา เรื่องสตรีมมิ่ง
รับปรึกษาเรื่องถ่ายทอดสด
ให้เช่าเซิฟเวอร์ถ่ายทอดสด
บริการ WowzaStreaming แบบรายเดือนพร้อมเซิฟเวอร์
สามารถขอทดลองใช้ได้
ติดต่อ id line:gopherth
โทร:0954984333

gd_ab

[direct=http://elvira.co.th/product/เตารีดไอน้ำ-รุ่น-540/]เตารีด เตารีดไอน้ำ[/direct]<br />[direct=http://elvira.co.th/product-category/จักรเย็บผ้าและอุปกรณ์-elvira/จักรเย็บผ้า/]จักรเย็บผ้า[/direct]<br />[direct=http://elvira.co.th]ELVIRA จักรเย็บผ้า เตารีดไอน้ำ เครื่องทำความสะอาดด้วยไอน้ำ เครื่องปั่นความเร็วสูง[/direct]<br />[direct=http://theeravat.com]Blog ส่วนตัวครับ[/direct]

zergolf37

VDOHIDE | HLS 

Shaytalay

ขอสอบถามครับ ถ้าอยากเขียนแบบ ไม่ใช้ \ ต้องทำยังไงหรอครับ
$text =  get_string_between($contents,"<meta name=\"description\" content=\"","โดย LINE TODAY\">");

powerpc

อ้างถึงจาก: Shaytalay ใน 15 ธันวาคม 2016, 15:35:44
ขอสอบถามครับ ถ้าอยากเขียนแบบ ไม่ใช้ \ ต้องทำยังไงหรอครับ
$text =  get_string_between($contents,"<meta name=\"description\" content=\"","โดย LINE TODAY\">");

แบบนี้ก็ได้ครับ
อ้างถึง$text =  get_string_between($contents,'<meta name="description" content="','โดย LINE TODAY">');
[แจกฟรี] [direct=https://thai.ac]เว็บไซต์โรงเรียนสำเร็จรูป[/direct]
[แจกฟรี] [direct=https://obec.ac]เว็บไซต์ครูสำเร็จรูป[/direct]
[ตัวแทนจำหน่าย] [direct=https://lotteryonline.in.th]มังกรฟ้า [/direct] [direct=https://lotteryonline.in.th]ลอตเตอรี่ออนไลน์[/direct]