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

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

ThaiSEOBoard.comพัฒนาเว็บไซต์Programming[บทที่ 3]สอนเขียน PHP ดึงข่าวจาก LINE TODAY เก็บลงฐานข้อมูล Step by Step[สายเทา]
หน้า: 1 2 [3] 4   ลงล่าง
พิมพ์
ผู้เขียน หัวข้อ: [บทที่ 3]สอนเขียน PHP ดึงข่าวจาก LINE TODAY เก็บลงฐานข้อมูล Step by Step[สายเทา]  (อ่าน 15206 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
powerpc
Verified Seller
สมุนแก๊งเสียว
*

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

กระทู้: 821



ดูรายละเอียด
« ตอบ #40 เมื่อ: 14 ธันวาคม 2016, 22:27:55 »

บทที่ 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];
}
?>
« แก้ไขครั้งสุดท้าย: 15 ธันวาคม 2016, 11:01:00 โดย powerpc » บันทึกการเข้า

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

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

กระทู้: 1,771



ดูรายละเอียด
« ตอบ #41 เมื่อ: 14 ธันวาคม 2016, 22:39:45 »

+1 ครับ
บันทึกการเข้า

ทำดีได้ดี เพราะทำด้วยใจ
beerqazasa
หัวหน้าแก๊งเสียว
*

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

กระทู้: 1,575



ดูรายละเอียด เว็บไซต์
« ตอบ #42 เมื่อ: 14 ธันวาคม 2016, 22:43:15 »

ทีเด็ด ขอบคุณครับ  wanwan017
บันทึกการเข้า
dekdoo
สมุนแก๊งเสียว
*

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

กระทู้: 891



ดูรายละเอียด เว็บไซต์
« ตอบ #43 เมื่อ: 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');
คำตอบคือได้ค่า ?
บันทึกการเข้า

powerpc
Verified Seller
สมุนแก๊งเสียว
*

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

กระทู้: 821



ดูรายละเอียด
« ตอบ #44 เมื่อ: 14 ธันวาคม 2016, 22:51:48 »

จาก 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
« แก้ไขครั้งสุดท้าย: 14 ธันวาคม 2016, 22:54:43 โดย powerpc » บันทึกการเข้า

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

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

กระทู้: 891



ดูรายละเอียด เว็บไซต์
« ตอบ #45 เมื่อ: 14 ธันวาคม 2016, 22:54:33 »

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

powerpc
Verified Seller
สมุนแก๊งเสียว
*

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

กระทู้: 821



ดูรายละเอียด
« ตอบ #46 เมื่อ: 14 ธันวาคม 2016, 22:55:36 »

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

อ้างถึง
*** แต่ get_string_between มีข้อจำกัดอยู่ว่า คำที่จะเป็นจุด start แล้ว end จะต้องเป็นข้อความเดียวที่ปรากฏอยู่ในข้อความต้นฉบับทั้งหมด ห้ามมีซ้ำกันหลายที่ เพราะตัว get_string_between จะไปจับเอาเฉพาะคำแรกที่เจอเท่านั้น หากคำนั้นไปอยู่กลางข้อความที่เราต้องการ มันก็จะตัดเอาเฉพาะส่วนแรก
« แก้ไขครั้งสุดท้าย: 14 ธันวาคม 2016, 22:57:07 โดย powerpc » บันทึกการเข้า

powerpc
Verified Seller
สมุนแก๊งเสียว
*

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

กระทู้: 821



ดูรายละเอียด
« ตอบ #47 เมื่อ: 14 ธันวาคม 2016, 23:02:49 »

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

การใช้ค่า fix ก็มีข้อคำนึกแค่ว่า เราจะใช้ตัวไหน ต้องให้แน่ใจว่าเป็น static code ที่อยู่ใน html ที่ดึงมา ซึ่งถ้าไม่มีการแก้ไขโค้ดต้นฉบับ เนื้อหาที่ดึงมาก็มีโอกาศน้อยที่จะเปลี่ยนไป แต่ก็มีเหมือนกันที่เว็บต้นทางแก้ไขโค้ด เราก็ต้องแก้ไขตามไปอีกที นี่คือเส้นทางนะครับ
บันทึกการเข้า

powerpc
Verified Seller
สมุนแก๊งเสียว
*

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

กระทู้: 821



ดูรายละเอียด
« ตอบ #48 เมื่อ: 14 ธันวาคม 2016, 23:04:56 »

แต่หลักการที่ผมใช้นี้ ก็ทดสอบมาแล้ว ใช้งานได้ดีไม่มีการรเปลี่ยนแปลงตั้งแต่ สิงหาคม 59 แต่ก็ไม่แน่เขียนเรื่องนี้ยังไม่ทันจบอาจมีการเปลี่ยนแปลงเกิดขึ้นได้  wanwan004
บันทึกการเข้า

powerpc
Verified Seller
สมุนแก๊งเสียว
*

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

กระทู้: 821



ดูรายละเอียด
« ตอบ #49 เมื่อ: 14 ธันวาคม 2016, 23:09:18 »

จริง ๆ มี 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
« แก้ไขครั้งสุดท้าย: 14 ธันวาคม 2016, 23:25:13 โดย powerpc » บันทึกการเข้า

nongwoonsen
Newbie
*

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

กระทู้: 1



ดูรายละเอียด
« ตอบ #50 เมื่อ: 15 ธันวาคม 2016, 04:08:33 »

ขอบคุณค่า รอ ติดตามตอนต่อไปจ้า  wanwan008
บันทึกการเข้า
Sakana
Newbie
*

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

กระทู้: 41



ดูรายละเอียด
« ตอบ #51 เมื่อ: 15 ธันวาคม 2016, 07:58:45 »

ขอบคุณครับ
บันทึกการเข้า

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

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

กระทู้: 468



ดูรายละเอียด เว็บไซต์
« ตอบ #52 เมื่อ: 15 ธันวาคม 2016, 09:21:03 »

ขอบคุณมากๆครับ ต้องลองศึกษา
บันทึกการเข้า

powerpc
Verified Seller
สมุนแก๊งเสียว
*

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

กระทู้: 821



ดูรายละเอียด
« ตอบ #53 เมื่อ: 15 ธันวาคม 2016, 11:04:20 »

ปรับปรุง 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];
}
?>

« แก้ไขครั้งสุดท้าย: 15 ธันวาคม 2016, 11:08:07 โดย powerpc » บันทึกการเข้า

Nasir
Newbie
*

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

กระทู้: 64



ดูรายละเอียด
« ตอบ #54 เมื่อ: 15 ธันวาคม 2016, 11:28:50 »

ตามด้วยคนครับผม
ขอบคุณมากๆๆครับ
บันทึกการเข้า

หลงรักเพชรบุรี
https://longrakphetchaburi.com
thaigopher
หัวหน้าแก๊งเสียว
*

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

กระทู้: 1,064



ดูรายละเอียด เว็บไซต์
« ตอบ #55 เมื่อ: 15 ธันวาคม 2016, 12:17:54 »

เก็บความรู้ครับ
บันทึกการเข้า

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

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

กระทู้: 353



ดูรายละเอียด เว็บไซต์
« ตอบ #56 เมื่อ: 15 ธันวาคม 2016, 13:32:26 »

ขอบคุณมากครับ ^^
บันทึกการเข้า

zergolf37
คนรักเสียว
*

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

กระทู้: 102



ดูรายละเอียด เว็บไซต์
« ตอบ #57 เมื่อ: 15 ธันวาคม 2016, 13:33:55 »

รอดูตอนจบครับ  wanwan003
บันทึกการเข้า

GGCDN | API GOOGLE DRIVE
Shaytalay
Newbie
*

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

กระทู้: 48



ดูรายละเอียด
« ตอบ #58 เมื่อ: 15 ธันวาคม 2016, 15:35:44 »

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

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

กระทู้: 821



ดูรายละเอียด
« ตอบ #59 เมื่อ: 15 ธันวาคม 2016, 16:32:37 »

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

แบบนี้ก็ได้ครับ
อ้างถึง
$text =  get_string_between($contents,'<meta name="description" content="','โดย LINE TODAY">');
บันทึกการเข้า

หน้า: 1 2 [3] 4   ขึ้นบน
พิมพ์