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

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

ThaiSEOBoard.comพัฒนาเว็บไซต์CMS & Free Script**อยากใส่ Script Google Drive Proxy Player ในเว็บ**
หน้า: 1 [2]   ลงล่าง
พิมพ์
ผู้เขียน หัวข้อ: **อยากใส่ Script Google Drive Proxy Player ในเว็บ**  (อ่าน 3466 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
jakky
สมุนแก๊งเสียว
*

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

กระทู้: 549



ดูรายละเอียด
« ตอบ #20 เมื่อ: 01 กุมภาพันธ์ 2018, 09:54:55 »

ถ้าจะทำเว็บจำพวกคลิป หรือว่าดูหนัง มันต้องแบบนี้ครับ
freemoviethai.com ไม่ต้องง้อ Google Drive ไม่ต้อง Openload ขั้นเทพมาก

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

เว็บท่านใช้ g drive ใช่ไหมครับเเล้วใช้ของเจ้าไหนหรอครับ proxy ราคาเเพงไหมหรอครับ
ใช้อยู่ตอนนี้ไม่มีปัญหาเลย ป้องกันโหลด ล็อคโดเมน

จะซื้อใช้ที่ไหนหรอครับ ราคาคิดยังไงหรอครับ ^^

ติดต่อได้ที่นี่เลยครับ ekcdn.me ระบบเทพมาก บอกเลย
บันทึกการเข้า
2DTH
ก๊วนเสียว
*

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

กระทู้: 468



ดูรายละเอียด เว็บไซต์
« ตอบ #21 เมื่อ: 01 กุมภาพันธ์ 2018, 16:34:43 »

ไม่รู้จะบอกอะไรเเต่ไม่เเนะนำถ้าใช้เเค่proxyplayerอย่างเดียว
นี่เป็นเว็บที่ผมคิดว่าจะเอาไว้อัพโหลดลงเว็บตัวเอง
googledrive //ก็อย่างที่รู้ๆกัน
openload //ปัจจุบันใช้อยู่ช้าเเต่ก็ยังดี
tunepk //มีให้เลือกความชัดเสียดายจำกัดขนาดไฟล์
stream.moe //ยังไม่ได้ลอง
mp4upload //ยังไม่ได้ลอง
streamango //ปัจจุบันใช้อยู่เร็วกว่าopenloadเเถมไฟล์ไม่ค่อยถูกลบ
streamcherry //ปัจจุบันใช้อยู่เร็วกว่าopenloadเเถมไฟล์ไม่ค่อยถูกลบ
rapidvideo //ปัจจุบันใช้อยู่เร็วดีเเถมมีปรับความชัดเเถมไฟล์ไม่ค่อยถูกลบ
vidoza //ปัจจุบันใช้อยู่ความเร็วกลางๆวิดีโอถูกลบบ่อยมากๆ
cloudup //ยังไม่ได้ลอง

มีเว็บอื่นอีกรึเปล่าก็ลืมไปเเย้ว--

dailymotion ไม่ชอบเท่าไรอัพโหลดจำกัดต่อวันเเถมมันถูกลบง่ายเหมือนกัน
mthai เน็ตผมเป็นของต่างประเทศเลยอัพช้าไม่ไหว555
youtube อัพได้เเต่ต้องมีเป็นหมื่นเเชเเนลเเละลงได้เฉพาะเรื่องที่ไม่ติดลิขสิท

เเค่คำเเนะนำนะครับ wanwan017
บันทึกการเข้า

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

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

กระทู้: 118



ดูรายละเอียด
« ตอบ #22 เมื่อ: 02 กุมภาพันธ์ 2018, 03:11:50 »

มาเก็บข้อมูลครับ  wanwan017 wanwan017 wanwan017
บันทึกการเข้า

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

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

กระทู้: 195



ดูรายละเอียด
« ตอบ #23 เมื่อ: 02 กุมภาพันธ์ 2018, 08:49:57 »

ถ้าจะทำเว็บจำพวกคลิป หรือว่าดูหนัง มันต้องแบบนี้ครับ
freemoviethai.com ไม่ต้องง้อ Google Drive ไม่ต้อง Openload ขั้นเทพมาก

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

เว็บท่านใช้ g drive ใช่ไหมครับเเล้วใช้ของเจ้าไหนหรอครับ proxy ราคาเเพงไหมหรอครับ
ใช้อยู่ตอนนี้ไม่มีปัญหาเลย ป้องกันโหลด ล็อคโดเมน

จะซื้อใช้ที่ไหนหรอครับ ราคาคิดยังไงหรอครับ ^^

ติดต่อได้ที่นี่เลยครับ ekcdn.me ระบบเทพมาก บอกเลย
ใช้อยู่แจ่มจริงๆ ใช้มานานแล้วครับ ปัญหาไม่มีเลย ไม่เชื่อดูตามเว็ปลายเซ็นต์ได้เยย
บันทึกการเข้า

Siamon
Newbie
*

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

กระทู้: 22



ดูรายละเอียด
« ตอบ #24 เมื่อ: 02 กุมภาพันธ์ 2018, 15:49:07 »

freemoviethai.com เว็บนี้ เจ๋งครับ มีไม่กี่เว็บในไทยที่ทำแบบนี้ได้ ส่วนมากจะเป็นเว็บของเขาหมด รู้สึกว่า 3-4 เว็บที่เขาทำ 
บันทึกการเข้า
jakkagi
หัวหน้าแก๊งเสียว
*

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

กระทู้: 1,678



ดูรายละเอียด
« ตอบ #25 เมื่อ: 02 กุมภาพันธ์ 2018, 16:03:00 »

ถ้าจะทำเว็บจำพวกคลิป หรือว่าดูหนัง มันต้องแบบนี้ครับ
freemoviethai.com ไม่ต้องง้อ Google Drive ไม่ต้อง Openload ขั้นเทพมาก

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

เว็บท่านใช้ g drive ใช่ไหมครับเเล้วใช้ของเจ้าไหนหรอครับ proxy ราคาเเพงไหมหรอครับ
ใช้อยู่ตอนนี้ไม่มีปัญหาเลย ป้องกันโหลด ล็อคโดเมน

จะซื้อใช้ที่ไหนหรอครับ ราคาคิดยังไงหรอครับ ^^

อยากทราบด้วยครับ
บันทึกการเข้า

iammee
Newbie
*

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

กระทู้: 58



ดูรายละเอียด
« ตอบ #26 เมื่อ: 02 กุมภาพันธ์ 2018, 16:09:12 »

freemoviethai.com เว็บนี้ เจ๋งครับ มีไม่กี่เว็บในไทยที่ทำแบบนี้ได้ ส่วนมากจะเป็นเว็บของเขาหมด รู้สึกว่า 3-4 เว็บที่เขาทำ 

 Lips Sealed ที่ทำงาน บล็อคพอร์ตไว้ก็เรียบร้อย
บันทึกการเข้า
minigoood
Global Moderator
หัวหน้าแก๊งเสียว
*****

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

กระทู้: 1,583



ดูรายละเอียด
« ตอบ #27 เมื่อ: 02 กุมภาพันธ์ 2018, 16:43:22 »

ถ้าจะทำเว็บจำพวกคลิป หรือว่าดูหนัง มันต้องแบบนี้ครับ
freemoviethai.com ไม่ต้องง้อ Google Drive ไม่ต้อง Openload ขั้นเทพมาก

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

เว็บท่านใช้ g drive ใช่ไหมครับเเล้วใช้ของเจ้าไหนหรอครับ proxy ราคาเเพงไหมหรอครับ
ใช้อยู่ตอนนี้ไม่มีปัญหาเลย ป้องกันโหลด ล็อคโดเมน

จะซื้อใช้ที่ไหนหรอครับ ราคาคิดยังไงหรอครับ ^^

อยากทราบด้วยครับ
ลองมาคุยที่เพจในลายเซ็นต์ได้ครับ
บันทึกการเข้า

█ 9EKRDP โหลดบิต อัพโฮสฝากไฟล์นอก
█ Google Drive
█ ตัวเล่นหนัง GDRIVE
█ 9EKRDP ENCODING PLAN เริ่มต้น 950 บาท
█ ผู้ให้บริการ Windows VPS, RDP Services ,Torrents and Files Upload !!
บุพเพสันนิวาส ดูหนัง
entraining
Newbie
*

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

กระทู้: 10



ดูรายละเอียด
« ตอบ #28 เมื่อ: 08 กุมภาพันธ์ 2019, 15:37:15 »

ถ้าจะทำเว็บจำพวกคลิป หรือว่าดูหนัง มันต้องแบบนี้ครับ
freemoviethai.com ไม่ต้องง้อ Google Drive ไม่ต้อง Openload ขั้นเทพมาก

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

เว็บท่านใช้ g drive ใช่ไหมครับเเล้วใช้ของเจ้าไหนหรอครับ proxy ราคาเเพงไหมหรอครับ
ใช้อยู่ตอนนี้ไม่มีปัญหาเลย ป้องกันโหลด ล็อคโดเมน

จะซื้อใช้ที่ไหนหรอครับ ราคาคิดยังไงหรอครับ ^^

อยากทราบด้วยครับ
ลองมาคุยที่เพจในลายเซ็นต์ได้ครับ

ถ้าเราจะเก็บไฟล์ mp4 บน Mediafire แล้วยิงมาเข้าที่ jw player นี่น่าสนใจใหมครับ
บันทึกการเข้า
virussman
สมุนแก๊งเสียว
*

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

กระทู้: 857



ดูรายละเอียด
« ตอบ #29 เมื่อ: 09 กุมภาพันธ์ 2019, 15:12:13 »

สคริปนี้เก่าแล้วมีแจกตามเว็บทั่วไป ถือว่าเป็นตัวครูสำหรับคนเริ่มศึกษา พวก curl,file_get_contents, เคยใช้นานแล้ว ไม่รู้เดี๋ยวนี้ จะยังใช้ได้หรือป่าวยังไม่ได้ทดสอบ ลองเอาไปศึกษาดูครับ

index.php
โค๊ด:
<?php
function curl($url)
{
$ch = @curl_init();
curl_setopt($chCURLOPT_URL$url);
$head[] = "Connection: keep-alive";
$head[] = "Keep-Alive: 300";
$head[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$head[] = "Accept-Language: en-us,en;q=0.5";
curl_setopt($chCURLOPT_USERAGENT'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36');
curl_setopt($chCURLOPT_HTTPHEADER$head);
curl_setopt($chCURLOPT_RETURNTRANSFER1);
curl_setopt($chCURLOPT_SSL_VERIFYHOSTFALSE);
curl_setopt($chCURLOPT_SSL_VERIFYPEERFALSE);
curl_setopt($chCURLOPT_TIMEOUT60);
curl_setopt($chCURLOPT_CONNECTTIMEOUT60);
curl_setopt($chCURLOPT_FOLLOWLOCATIONTRUE);
curl_setopt($chCURLOPT_HTTPHEADER, array('Expect:'));
$page curl_exec($ch);
curl_close($ch);
return $page;
}

if(isset(
$_GET['link'])) {
$get curl($_GET['link']);
$data explode('urlu003d'$get);
$link explode('=m'$data[1]);
$decode urldecode($link[0]);
$count count($data);
if($count == 5) {
$v1080p $decode.'=m37<br>';
$v720p $decode.'=m22<br>';
$v360p $decode.'=m18<br>';
echo $v1080p.$v720p.$v360p;
} elseif($count == 4) {
$v720p $decode.'=m22<br>';
$v360p $decode.'=m18<br>';
echo $v720p.$v360p;
} elseif($count == 3) {
$v360p $decode.'=m18<br>';
echo $v360p;
}
}
?>

-----------------------------------------------------
อีกสคริป มี2ไฟล์ Getlink Drive

index.php

โค๊ด:
<?php

error_reporting
(0);
include 
"dom.php";

function 
getlink($id)
{
$link "https://drive.google.com/uc?export=download&id=$id";
$ch curl_init();
curl_setopt ($chCURLOPT_URL$link);
curl_setopt($chCURLOPT_HEADERTRUE);
curl_setopt($chCURLOPT_SSL_VERIFYPEER,false);
curl_setopt($chCURLOPT_SSL_VERIFYHOST,false);
curl_setopt($chCURLOPT_RETURNTRANSFER1);
curl_setopt($chCURLOPT_COOKIEJARdirname(__FILE__) . "/google.mp3");
curl_setopt($chCURLOPT_COOKIEFILEdirname(__FILE__) . "/google.mp3");

$page curl_exec($ch);
$chuyen =  locheader($page);
if ($chuyen != ""){

} else {
$html str_get_html($page);
$link urldecode(trim($html->find('a[id=uc-download-link]',0)->href));
$tmp explode("confirm=",$link);
$tmp2 explode("&",$tmp[1]);
$confirm $tmp2[0];
$linkdowngoc "https://drive.google.com/uc?export=download&id=$id&confirm=$confirm";
curl_setopt ($chCURLOPT_URL$linkdowngoc);
curl_setopt($chCURLOPT_HEADERTRUE);
curl_setopt($chCURLOPT_SSL_VERIFYPEER,false);
curl_setopt($chCURLOPT_SSL_VERIFYHOST,false);
curl_setopt($chCURLOPT_RETURNTRANSFER1);
curl_setopt($chCURLOPT_COOKIEJARdirname(__FILE__) . "/google.mp3");
curl_setopt($chCURLOPT_COOKIEFILEdirname(__FILE__) . "/google.mp3");

// Getting binary data
$page curl_exec($ch);
$chuyen =  locheader($page);

}
curl_close($ch);
return 
$chuyen
}
function 
locheader($page)
{
$temp explode("rn"$page);
foreach ($temp as $item) {
$temp2 explode(": "$item);
$infoheader[$temp2[0]] = $temp2[1];
}
$location $infoheader['Location'];
return $location;
}

if(
$_POST['submit'] != "")
{
$url $_POST['url'];
$tmp explode("file/d/",$url);
$tmp2 explode("/",$tmp[1]);
$id $tmp2[0];
$linkdown trim(getlink($id));
}




?>

<html>
<head>
<title>Get link Google Drive</title>
</head>
<body>
<form action="" method="POST">

<input type="text" size="50" name="url" value="https://drive.google.com/file/d/0BxG6kVC7OXgrYW1DVVVuZTZndmM/view?usp=sharing"/>
<input type="submit" value="GET" name="submit" />
</form>
<br />
<?php echo $linkdown;?>
</body>
</html>

dom.php

แก้ไขโพสยาวเกิน dom.php อยู่เม้นด่านล่างครับ ***
« แก้ไขครั้งสุดท้าย: 09 กุมภาพันธ์ 2019, 15:16:10 โดย virussman » บันทึกการเข้า

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

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

กระทู้: 857



ดูรายละเอียด
« ตอบ #30 เมื่อ: 09 กุมภาพันธ์ 2019, 15:14:26 »

dom.php
โค๊ด:
<?php

define
(&#39;HDOM_TYPE_ELEMENT&#39;, 1);
define(&#39;HDOM_TYPE_COMMENT&#39;, 2);
define(&#39;HDOM_TYPE_TEXT&#39;,    3);
define(&#39;HDOM_TYPE_ENDTAG&#39;,  4);
define(&#39;HDOM_TYPE_ROOT&#39;,    5);
define(&#39;HDOM_TYPE_UNKNOWN&#39;, 6);
define(&#39;HDOM_QUOTE_DOUBLE&#39;, 0);
define(&#39;HDOM_QUOTE_SINGLE&#39;, 1);
define(&#39;HDOM_QUOTE_NO&#39;,     3);
define(&#39;HDOM_INFO_BEGIN&#39;,   0);
define(&#39;HDOM_INFO_END&#39;,     1);
define(&#39;HDOM_INFO_QUOTE&#39;,   2);
define(&#39;HDOM_INFO_SPACE&#39;,   3);
define(&#39;HDOM_INFO_TEXT&#39;,    4);
define(&#39;HDOM_INFO_INNER&#39;,   5);
define(&#39;HDOM_INFO_OUTER&#39;,   6);
define(&#39;HDOM_INFO_ENDSPACE&#39;,7);

// helper functions
// -----------------------------------------------------------------------------
// get html dom form file


function file_get_html() {
    
$dom = new simple_html_dom;
    
$args func_get_args();
    
$dom->load(call_user_func_array(&#39;file_get_contents&#39;, $args), true);
    
return $dom;
}

// get html dom form string
function str_get_html($str$lowercase=true) {
    
$dom = new simple_html_dom;
    
$dom->load($str$lowercase);
    return 
$dom;
}

// dump html dom tree
function dump_html_tree($node$show_attr=true$deep=0) {
    
$lead str_repeat(&#39;    &#39;, $deep);
    
echo $lead.$node->tag;
    if (
$show_attr && count($node->attr)>0) {
        echo &
#39;(&#39;;
        
foreach($node->attr as $k=>$v)
            echo 
"[$k]=>"".$node->$k.&#39;", &#39;;
        
echo &#39;)&#39;;
    
}
    echo 
"n";

    foreach(
$node->nodes as $c)
        
dump_html_tree($c$show_attr$deep 1);
}

// get dom form file (deprecated)
function file_get_dom() {
    
$dom = new simple_html_dom;
    
$args func_get_args();
    
$dom->load(call_user_func_array(&#39;file_get_contents&#39;, $args), true);
    
return $dom;
}

// get dom form string (deprecated)
function str_get_dom($str$lowercase=true) {
    
$dom = new simple_html_dom;
    
$dom->load($str$lowercase);
    return 
$dom;
}

// simple html dom node
// -----------------------------------------------------------------------------
class simple_html_dom_node {
    public 
$nodetype HDOM_TYPE_TEXT;
    public 
$tag = &#39;text&#39;;
    
public $attr = array();
    public 
$children = array();
    public 
$nodes = array();
    public 
$parent null;
    public 
$_ = array();
    private 
$dom null;

    function 
__construct($dom) {
        
$this->dom $dom;
        
$dom->nodes[] = $this;
    }

    function 
__destruct() {
        
$this->clear();
    }

    function 
__toString() {
        return 
$this->outertext();
    }

    
// clean up memory due to php5 circular references memory leak...
    
function clear() {
        
$this->dom null;
        
$this->nodes null;
        
$this->parent null;
        
$this->children null;
    }
    
    
// dump node&#39;s tree
    
function dump($show_attr=true) {
        
dump_html_tree($this$show_attr);
    }

    
// returns the parent of node
    
function parent() {
        return 
$this->parent;
    }

    
// returns children of node
    
function children($idx=-1) {
        if (
$idx===-1) return $this->children;
        if (isset(
$this->children[$idx])) return $this->children[$idx];
        return 
null;
    }

    
// returns the first child of node
    
function first_child() {
        if (
count($this->children)>0) return $this->children[0];
        return 
null;
    }

    
// returns the last child of node
    
function last_child() {
        if ((
$count=count($this->children))>0) return $this->children[$count-1];
        return 
null;
    }

    
// returns the next sibling of node    
    
function next_sibling() {
        if (
$this->parent===null) return null;
        
$idx 0;
        
$count count($this->parent->children);
        while (
$idx<$count && $this!==$this->parent->children[$idx])
              
$idx;
        if (  
$idx>=$count) return null;
        return 
$this->parent->children[$idx];
    }

    
// returns the previous sibling of node
    
function prev_sibling() {
        if (
$this->parent===null) return null;
        
$idx 0;
        
$count count($this->parent->children);
        while (
$idx<$count && $this!==$this->parent->children[$idx])
              
$idx;
        if (--
$idx<0) return null;
        return 
$this->parent->children[$idx];
    }

    
// get dom node&#39;s inner html
    
function innertext() {
        if (isset(
$this->_[HDOM_INFO_INNER])) return $this->_[HDOM_INFO_INNER];
        if (isset(
$this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);

        
$ret = &#39;&#39;;
        
foreach($this->nodes as $n)
            
$ret .= $n->outertext();
        return 
$ret;
    }

    
// get dom node&#39;s outer text (with tag)
    
function outertext() {
        if (
$this->tag===&#39;root&#39;) return $this->innertext();

        // trigger callback
        
if ($this->dom->callback!==null)
            
call_user_func_array($this->dom->callback, array($this));

        if (isset(
$this->_[HDOM_INFO_OUTER])) return $this->_[HDOM_INFO_OUTER];
        if (isset(
$this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);

        
// render begin tag
        
$ret $this->dom->nodes[$this->_[HDOM_INFO_BEGIN]]->makeup();

        
// render inner text
        
if (isset($this->_[HDOM_INFO_INNER]))
            
$ret .= $this->_[HDOM_INFO_INNER];
        else {
            foreach(
$this->nodes as $n)
                
$ret .= $n->outertext();
        }

        
// render end tag
        
if(isset($this->_[HDOM_INFO_END]) && $this->_[HDOM_INFO_END]!=0)
            
$ret .= &#39;</&#39;.$this->tag.&#39;>&#39;;
        
return $ret;
    }

    
// get dom node&#39;s plain text
    
function text() {
        if (isset(
$this->_[HDOM_INFO_INNER])) return $this->_[HDOM_INFO_INNER];
        switch (
$this->nodetype) {
            case 
HDOM_TYPE_TEXT: return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);
            case 
HDOM_TYPE_COMMENT: return &#39;&#39;;
            
case HDOM_TYPE_UNKNOWN: return &#39;&#39;;
        
}
        if (
strcasecmp($this->tag, &#39;script&#39;)===0) return &#39;&#39;;
        
if (strcasecmp($this->tag, &#39;style&#39;)===0) return &#39;&#39;;

        
$ret = &#39;&#39;;
        
foreach($this->nodes as $n)
            
$ret .= $n->text();
        return 
$ret;
    }
    
    function 
xmltext() {
        
$ret $this->innertext();
        
$ret str_ireplace(&#39;<![CDATA[&#39;, &#39;&#39;, $ret);
        
$ret str_replace(&#39;]]>&#39;, &#39;&#39;, $ret);
        
return $ret;
    }

    
// build node&#39;s text with tag
    
function makeup() {
        
// text, comment, unknown
        
if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);

        
$ret = &#39;<&#39;.$this->tag;
        
$i = -1;

        foreach(
$this->attr as $key=>$val) {
              
$i;

            
// skip removed attribute
            
if ($val===null || $val===false)
                continue;

            
$ret .= $this->_[HDOM_INFO_SPACE][$i][0];
            
//no value attr: nowrap, checked selected...
            
if ($val===true)
                
$ret .= $key;
            else {
                switch(
$this->_[HDOM_INFO_QUOTE][$i]) {
                    case 
HDOM_QUOTE_DOUBLE$quote = &#39;"&#39;; break;
                    
case HDOM_QUOTE_SINGLE$quote = &#39;&#39;&#39;; break;
                    
default: $quote = &#39;&#39;;
                
}
                
$ret .= $key.$this->_[HDOM_INFO_SPACE][$i][1].&#39;=&#39;.$this->_[HDOM_INFO_SPACE][$i][2].$quote.$val.$quote;
            
}
        }
        
$ret $this->dom->restore_noise($ret);
        return 
$ret $this->_[HDOM_INFO_ENDSPACE] . &#39;>&#39;;
    
}

    
// find elements by css selector
    
function find($selector$idx=null) {
        
$selectors $this->parse_selector($selector);
        if ((
$count=count($selectors))===0) return array();
        
$found_keys = array();

        
// find each selector
        
for ($c=0$c<$count;   $c) {
            if ((
$levle=count($selectors[0]))===0) return array();
            if (!isset(
$this->_[HDOM_INFO_BEGIN])) return array();

            
$head = array($this->_[HDOM_INFO_BEGIN]=>1);

            
// handle descendant selectors, no recursive!
            
for ($l=0$l<$levle;   $l) {
                
$ret = array();
                foreach(
$head as $k=>$v) {
                    
$n = ($k===-1) ? $this->dom->root $this->dom->nodes[$k];
                    
$n->seek($selectors[$c][$l], $ret);
                }
                
$head $ret;
            }

            foreach(
$head as $k=>$v) {
                if (!isset(
$found_keys[$k]))
                    
$found_keys[$k] = 1;
            }
        }

        
// sort keys
        
ksort($found_keys);

        
$found = array();
        foreach(
$found_keys as $k=>$v)
            
$found[] = $this->dom->nodes[$k];

        
// return nth-element or array
        
if (is_null($idx)) return $found;
else if ($idx<0$idx count($found)   $idx;
        return (isset(
$found[$idx])) ? $found[$idx] : null;
    }

    
// seek for given conditions
    
protected function seek($selector, &$ret) {
        list(
$tag$key$val$exp$no_key) = $selector;

        
// xpath index
        
if ($tag && $key && is_numeric($key)) {
            
$count 0;
            foreach (
$this->children as $c) {
                if (
$tag===&#39;*&#39; || $tag===$c->tag) {
                    
if (  $count==$key) {
                        
$ret[$c->_[HDOM_INFO_BEGIN]] = 1;
                        return;
                    }
                }
            } 
            return;
        }

        
$end = (!empty($this->_[HDOM_INFO_END])) ? $this->_[HDOM_INFO_END] : 0;
        if (
$end==0) {
            
$parent $this->parent;
            while (!isset(
$parent->_[HDOM_INFO_END]) && $parent!==null) {
                
$end -= 1;
                
$parent $parent->parent;
            }
            
$end  $parent->_[HDOM_INFO_END];
        }

        for(
$i=$this->_[HDOM_INFO_BEGIN1$i<$end;   $i) {
            
$node $this->dom->nodes[$i];
            
$pass true;

            if (
$tag===&#39;*&#39; && !$key) {
                
if (in_array($node$this->childrentrue))
                    
$ret[$i] = 1;
                continue;
            }

            
// compare tag
            
if ($tag && $tag!=$node->tag && $tag!==&#39;*&#39;) {$pass=false;}
            // compare key
            
if ($pass && $key) {
                if (
$no_key) {
                    if (isset(
$node->attr[$key])) $pass=false;
                }
                else if (!isset(
$node->attr[$key])) $pass=false;
            }
            
// compare value
            
if ($pass && $key && $val  && $val!==&#39;*&#39;) {
                
$check $this->match($exp$val$node->attr[$key]);
                
// handle multiple class
                
if (!$check && strcasecmp($key, &#39;class&#39;)===0) {
                    
foreach(explode(&#39; &#39;,$node->attr[$key]) as $k) {
                        
$check $this->match($exp$val$k);
                        if (
$check) break;
                    }
                }
                if (!
$check$pass false;
            }
            if (
$pass$ret[$i] = 1;
            unset(
$node);
        }
    }

    protected function 
match($exp$pattern$value) {
        switch (
$exp) {
            case &
#39;=&#39;:
                
return ($value===$pattern);
            case &
#39;!=&#39;:
                
return ($value!==$pattern);
            case &
#39;^=&#39;:
                
return preg_match("/^".preg_quote($pattern,&#39;/&#39;)."/", $value);
            
case &#39;$=&#39;:
                
return preg_match("/".preg_quote($pattern,&#39;/&#39;)."$/", $value);
            
case &#39;*=&#39;:
                
if ($pattern[0]==&#39;/&#39;)
                    
return preg_match($pattern$value);
                return 
preg_match("/".$pattern."/i"$value);
        }
        return 
false;
    }

    protected function 
parse_selector($selector_string) {
        
// pattern of CSS selectors, modified from mootools
        
$pattern "/([w-:*]*)(?:#([w-] )|.([w-] ))?(?:[@?(!?[w-] )(?:([!*^$]?=)["&#39;]?(.*?)["&#39;]?)?])?([/, ] )/is";
        
preg_match_all($patterntrim($selector_string).&#39; &#39;, $matches, PREG_SET_ORDER);
        
$selectors = array();
        
$result = array();
        
//print_r($matches);

        
foreach ($matches as $m) {
            
$m[0] = trim($m[0]);
            if (
$m[0]===&#39;&#39; || $m[0]===&#39;/&#39; || $m[0]===&#39;//&#39;) continue;
            // for borwser grnreated xpath
            
if ($m[1]===&#39;tbody&#39;) continue;

            
list($tag$key$val$exp$no_key) = array($m[1], nullnull, &#39;=&#39;, false);
            
if(!empty($m[2])) {$key=&#39;id&#39;; $val=$m[2];}
            
if(!empty($m[3])) {$key=&#39;class&#39;; $val=$m[3];}
            
if(!empty($m[4])) {$key=$m[4];}
            if(!empty(
$m[5])) {$exp=$m[5];}
            if(!empty(
$m[6])) {$val=$m[6];}

            
// convert to lowercase
            
if ($this->dom->lowercase) {$tag=strtolower($tag); $key=strtolower($key);}
            
//elements that do NOT have the specified attribute
            
if (isset($key[0]) && $key[0]===&#39;!&#39;) {$key=substr($key, 1); $no_key=true;}

            
$result[] = array($tag$key$val$exp$no_key);
            if (
trim($m[7])===&#39;,&#39;) {
                
$selectors[] = $result;
                
$result = array();
            }
        }
        if (
count($result)>0)
            
$selectors[] = $result;
        return 
$selectors;
    }

    function 
__get($name) {
        if (isset(
$this->attr[$name])) return $this->attr[$name];
        switch(
$name) {
            case &
#39;outertext&#39;: return $this->outertext();
            
case &#39;innertext&#39;: return $this->innertext();
            
case &#39;plaintext&#39;: return $this->text();
            
case &#39;xmltext&#39;: return $this->xmltext();
            
default: return array_key_exists($name$this->attr);
        }
    }

    function 
__set($name$value) {
        switch(
$name) {
            case &
#39;outertext&#39;: return $this->_[HDOM_INFO_OUTER] = $value;
            
case &#39;innertext&#39;:
                
if (isset($this->_[HDOM_INFO_TEXT])) return $this->_[HDOM_INFO_TEXT] = $value;
                return 
$this->_[HDOM_INFO_INNER] = $value;
        }
        if (!isset(
$this->attr[$name])) {
            
$this->_[HDOM_INFO_SPACE][] = array(&#39; &#39;, &#39;&#39;, &#39;&#39;); 
            
$this->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_DOUBLE;
        }
        
$this->attr[$name] = $value;
    }

    function 
__isset($name) {
        switch(
$name) {
            case &
#39;outertext&#39;: return true;
            
case &#39;innertext&#39;: return true;
            
case &#39;plaintext&#39;: return true;
        
}
        
//no value attr: nowrap, checked selected...
        
return (array_key_exists($name$this->attr)) ? true : isset($this->attr[$name]);
    }

    function 
__unset($name) {
        if (isset(
$this->attr[$name]))
            unset(
$this->attr[$name]);
    }

    
// camel naming conventions
    
function getAllAttributes() {return $this->attr;}
    function 
getAttribute($name) {return $this->__get($name);}
    function 
setAttribute($name$value) {$this->__set($name$value);}
    function 
hasAttribute($name) {return $this->__isset($name);}
    function 
removeAttribute($name) {$this->__set($namenull);}
    function 
getElementById($id) {return $this->find("#$id"0);}
    function 
getElementsById($id$idx=null) {return $this->find("#$id"$idx);}
    function 
getElementByTagName($name) {return $this->find($name0);}
    function 
getElementsByTagName($name$idx=null) {return $this->find($name$idx);}
    function 
parentNode() {return $this->parent();}
    function 
childNodes($idx=-1) {return $this->children($idx);}
    function 
firstChild() {return $this->first_child();}
    function 
lastChild() {return $this->last_child();}
    function 
nextSibling() {return $this->next_sibling();}
    function 
previousSibling() {return $this->prev_sibling();}
}

// simple html dom parser
// -----------------------------------------------------------------------------
class simple_html_dom {
    public 
$root null;
    public 
$nodes = array();
    public 
$callback null;
    public 
$lowercase false;
    protected 
$pos;
    protected 
$doc;
    protected 
$char;
    protected 
$size;
    protected 
$cursor;
    protected 
$parent;
    protected 
$noise = array();
    protected 
$token_blank " trn";
    protected 
$token_equal = &#39; =/>&#39;;
    
protected $token_slash " />rnt";
    protected 
$token_attr = &#39; >&#39;;
    // use isset instead of in_array, performance boost about 30%...
    
protected $self_closing_tags = array(&#39;img&#39;=>1, &#39;br&#39;=>1, &#39;input&#39;=>1, &#39;meta&#39;=>1, &#39;link&#39;=>1, &#39;hr&#39;=>1, &#39;base&#39;=>1, &#39;embed&#39;=>1, &#39;spacer&#39;=>1);
    
protected $block_tags = array(&#39;root&#39;=>1, &#39;body&#39;=>1, &#39;form&#39;=>1, &#39;div&#39;=>1, &#39;span&#39;=>1, &#39;table&#39;=>1);
    
protected $optional_closing_tags = array(
        &
#39;tr&#39;=>array(&#39;tr&#39;=>1, &#39;td&#39;=>1, &#39;th&#39;=>1),
        
&#39;th&#39;=>array(&#39;th&#39;=>1),
        
&#39;td&#39;=>array(&#39;td&#39;=>1),
        
&#39;li&#39;=>array(&#39;li&#39;=>1),
        
&#39;dt&#39;=>array(&#39;dt&#39;=>1, &#39;dd&#39;=>1),
        
&#39;dd&#39;=>array(&#39;dd&#39;=>1, &#39;dt&#39;=>1),
        
&#39;dl&#39;=>array(&#39;dd&#39;=>1, &#39;dt&#39;=>1),
        
&#39;p&#39;=>array(&#39;p&#39;=>1),
        
&#39;nobr&#39;=>array(&#39;nobr&#39;=>1),
    
);

    function 
__construct($str=null) {
        if (
$str) {
            if (
preg_match("/^http:///i",$str) || is_file($str)) 
                
$this->load_file($str); 
            else
                
$this->load($str);
        }
    }

    function 
__destruct() {
        
$this->clear();
    }

    
// load html from string
    
function load($str$lowercase=true) {
        
// prepare
        
$this->prepare($str$lowercase);
        
// strip out comments
        
$this->remove_noise("&#39;<!--(.*?)-->&#39;is");
        
// strip out cdata
        
$this->remove_noise("&#39;<![CDATA[(.*?)]]>&#39;is"true);
        
// strip out <style> tags
        
$this->remove_noise("&#39;<s*style[^>]*[^/]>(.*?)<s*/s*styles*>&#39;is");
        
$this->remove_noise("&#39;<s*styles*>(.*?)<s*/s*styles*>&#39;is");
        
// strip out <script> tags
        
$this->remove_noise("&#39;<s*script[^>]*[^/]>(.*?)<s*/s*scripts*>&#39;is");
        
$this->remove_noise("&#39;<s*scripts*>(.*?)<s*/s*scripts*>&#39;is");
        
// strip out preformatted tags
        
$this->remove_noise("&#39;<s*(?:code)[^>]*>(.*?)<s*/s*(?:code)s*>&#39;is");
        
// strip out server side scripts
        
$this->remove_noise("&#39;(<?)(.*?)(?>
)'s", true);
        // strip smarty scripts
        $this->remove_noise("'({w)(.*?)(})'s", true);

        // parsing
        while ($this->parse());
        // end
        $this->root->_[HDOM_INFO_END] = $this->cursor;
    }

    // load html from file
    function load_file() {
        $args = func_get_args();
        $this->load(call_user_func_array('file_get_contents', $args), true);
    }

    // set callback function
    function set_callback($function_name) {
        $this->callback = $function_name;
    }

    // remove callback function
    function remove_callback() {
        $this->callback = null;
    }

    // save dom as string
    function save($filepath='') {
        $ret = $this->root->innertext();
        if ($filepath!=='') file_put_contents($filepath, $ret);
        return $ret;
    }

    // find dom node by css selector
    function find($selector, $idx=null) {
        return $this->root->find($selector, $idx);
    }

    // clean up memory due to php5 circular references memory leak...
    function clear() {
        foreach($this->nodes as $n) {$n->clear(); $n = null;}
        if (isset($this->parent)) {$this->parent->clear(); unset($this->parent);}
        if (isset($this->root)) {$this->root->clear(); unset($this->root);}
        unset($this->doc);
        unset($this->noise);
    }
   
    function dump($show_attr=true) {
        $this->root->dump($show_attr);
    }

    // prepare HTML data and init everything
    protected function prepare($str, $lowercase=true) {
        $this->clear();
        $this->doc = $str;
        $this->pos = 0;
        $this->cursor = 1;
        $this->noise = array();
        $this->nodes = array();
        $this->lowercase = $lowercase;
        $this->root = new simple_html_dom_node($this);
        $this->root->tag = 'root';
        $this->root->_[HDOM_INFO_BEGIN] = -1;
        $this->root->nodetype = HDOM_TYPE_ROOT;
        $this->parent = $this->root;
        // set the length of content
        $this->size = strlen($str);
        if ($this->size>0) $this->char = $this->doc[0];
    }

    // parse html content
    protected function parse() {
        if (($s = $this->copy_until_char('<'))==='')
            return $this->read_tag();

        // text
        $node = new simple_html_dom_node($this);
          $this->cursor;
        $node->_[HDOM_INFO_TEXT] = $s;
        $this->link_nodes($node, false);
        return true;
    }

    // read tag info
    protected function read_tag() {
        if ($this->char!=='<') {
            $this->root->_[HDOM_INFO_END] = $this->cursor;
            return false;
        }
        $begin_tag_pos = $this->pos;
        $this->char = (  $this->pos<$this->size) ? $this->doc[$this->pos] : null; // next

        // end tag
        if ($this->char==='/') {
            $this->char = (  $this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
            $this->skip($this->token_blank_t);
            $tag = $this->copy_until_char('>');

            // skip attributes in end tag
            if (($pos = strpos($tag, ' '))!==false)
                $tag = substr($tag, 0, $pos);

            $parent_lower = strtolower($this->parent->tag);
            $tag_lower = strtolower($tag);

            if ($parent_lower!==$tag_lower) {
                if (isset($this->optional_closing_tags[$parent_lower]) && isset($this->block_tags[$tag_lower])) {
                    $this->parent->_[HDOM_INFO_END] = 0;
                    $org_parent = $this->parent;

                    while (($this->parent->parent) && strtolower($this->parent->tag)!==$tag_lower)
                        $this->parent = $this->parent->parent;

                    if (strtolower($this->parent->tag)!==$tag_lower) {
                        $this->parent = $org_parent; // restore origonal parent
                        if ($this->parent->parent) $this->parent = $this->parent->parent;
                        $this->parent->_[HDOM_INFO_END] = $this->cursor;
                        return $this->as_text_node($tag);
                    }
                }
                else if (($this->parent->parent) && isset($this->block_tags[$tag_lower])) {
                    $this->parent->_[HDOM_INFO_END] = 0;
                    $org_parent = $this->parent;

                    while (($this->parent->parent) && strtolower($this->parent->tag)!==$tag_lower)
                        $this->parent = $this->parent->parent;

                    if (strtolower($this->parent->tag)!==$tag_lower) {
                        $this->parent = $org_parent; // restore origonal parent
                        $this->parent->_[HDOM_INFO_END] = $this->cursor;
                        return $this->as_text_node($tag);
                    }
                }
                else if (($this->parent->parent) && strtolower($this->parent->parent->tag)===$tag_lower) {
                    $this->parent->_[HDOM_INFO_END] = 0;
                    $this->parent = $this->parent->parent;
                }
                else
                    return $this->as_text_node($tag);
            }

            $this->parent->_[HDOM_INFO_END] = $this->cursor;
            if ($this->parent->parent) $this->parent = $this->parent->parent;

            $this->char = (  $this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
            return true;
        }

        $node = new simple_html_dom_node($this);
        $node->_[HDOM_INFO_BEGIN] = $this->cursor;
          $this->cursor;
        $tag = $this->copy_until($this->token_slash);

        // doctype, cdata & comments...
        if (isset($tag[0]) && $tag[0]==='!') {
            $node->_[HDOM_INFO_TEXT] = '<' . $tag . $this->copy_until_char('>');

            if (isset($tag[2]) && $tag[1]==='-' && $tag[2]==='-') {
                $node->nodetype = HDOM_TYPE_COMMENT;
                $node->tag = 'comment';
            } else {
                $node->nodetype = HDOM_TYPE_UNKNOWN;
                $node->tag = 'unknown';
            }

            if ($this->char==='>') $node->_[HDOM_INFO_TEXT].='>';
            $this->link_nodes($node, true);
            $this->char = (  $this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
            return true;
        }

        // text
        if ($pos=strpos($tag, '<')!==false) {
            $tag = '<' . substr($tag, 0, -1);
            $node->_[HDOM_INFO_TEXT] = $tag;
            $this->link_nodes($node, false);
            $this->char = $this->doc[--$this->pos]; // prev
            return true;
        }

        if (!preg_match("/^[w-:] $/", $tag)) {
            $node->_[HDOM_INFO_TEXT] = '<' . $tag . $this->copy_until('<>');
            if ($this->char==='<') {
                $this->link_nodes($node, false);
                return true;
            }

            if ($this->char==='>') $node->_[HDOM_INFO_TEXT].='>';
            $this->link_nodes($node, false);
            $this->char = (  $this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
            return true;
        }

        // begin tag
        $node->nodetype = HDOM_TYPE_ELEMENT;
        $tag_lower = strtolower($tag);
        $node->tag = ($this->lowercase) ? $tag_lower : $tag;

        // handle optional closing tags
        if (isset($this->optional_closing_tags[$tag_lower]) ) {
            while (isset($this->optional_closing_tags[$tag_lower][strtolower($this->parent->tag)])) {
                $this->parent->_[HDOM_INFO_END] = 0;
                $this->parent = $this->parent->parent;
            }
            $node->parent = $this->parent;
        }

        $guard = 0; // prevent infinity loop
        $space = array($this->copy_skip($this->token_blank), '', '');

        // attributes
        do {
            if ($this->char!==null && $space[0]==='') break;
            $name = $this->copy_until($this->token_equal);
            if($guard===$this->pos) {
                $this->char = (  $this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
                continue;
            }
            $guard = $this->pos;

            // handle endless '<'
            if($this->pos>=$this->size-1 && $this->char!=='>') {
                $node->nodetype = HDOM_TYPE_TEXT;
                $node->_[HDOM_INFO_END] = 0;
                $node->_[HDOM_INFO_TEXT] = '<'.$tag . $space[0] . $name;
                $node->tag = 'text';
                $this->link_nodes($node, false);
                return true;
            }

            // handle mismatch '<'
            if($this->doc[$this->pos-1]=='<') {
                $node->nodetype = HDOM_TYPE_TEXT;
                $node->tag = 'text';
                $node->attr = array();
                $node->_[HDOM_INFO_END] = 0;
                $node->_[HDOM_INFO_TEXT] = substr($this->doc, $begin_tag_pos, $this->pos-$begin_tag_pos-1);
                $this->pos -= 2;
                $this->char = (  $this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
                $this->link_nodes($node, false);
                return true;
            }

            if ($name!=='/' && $name!=='') {
                $space[1] = $this->copy_skip($this->token_blank);
                $name = $this->restore_noise($name);
                if ($this->lowercase) $name = strtolower($name);
                if ($this->char==='=') {
                    $this->char = (  $this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
                    $this->parse_attr($node, $name, $space);
                }
                else {
                    //no value attr: nowrap, checked selected...
                    $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_NO;
                    $node->attr[$name] = true;
                    if ($this->char!='>') $this->char = $this->doc[--$this->pos]; // prev
                }
                $node->_[HDOM_INFO_SPACE][] = $space;
                $space = array($this->copy_skip($this->token_blank), '', '');
            }
            else
                break;
        } while($this->char!=='>' && $this->char!=='/');

        $this->link_nodes($node, true);
        $node->_[HDOM_INFO_ENDSPACE] = $space[0];

        // check self closing
        if ($this->copy_until_char_escape('>')==='/') {
            $node->_[HDOM_INFO_ENDSPACE] .= '/';
            $node->_[HDOM_INFO_END] = 0;
        }
        else {
            // reset parent
            if (!isset($this->self_closing_tags[strtolower($node->tag)])) $this->parent = $node;
        }
        $this->char = (  $this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
        return true;
    }

    // parse attributes
    protected function parse_attr($node, $name, &$space) {
        $space[2] = $this->copy_skip($this->token_blank);
        switch($this->char) {
            case '"':
                $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_DOUBLE;
                $this->char = (  $this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
                $node->attr[$name] = $this->restore_noise($this->copy_until_char_escape('"'));
                $this->char = (  $this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
                break;
            case ''':
                $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_SINGLE;
                $this->char = (  $this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
                $node->attr[$name] = $this->restore_noise($this->copy_until_char_escape('''));
                $this->char = (  $this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
                break;
            default:
                $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_NO;
                $node->attr[$name] = $this->restore_noise($this->copy_until($this->token_attr));
        }
    }

    // link node's parent
    protected function link_nodes(&$node, $is_child) {
        $node->parent = $this->parent;
        $this->parent->nodes[] = $node;
        if ($is_child)
            $this->parent->children[] = $node;
    }

    // as a text node
    protected function as_text_node($tag) {
        $node = new simple_html_dom_node($this);
          $this->cursor;
        $node->_[HDOM_INFO_TEXT] = '</' . $tag . '>';
        $this->link_nodes($node, false);
        $this->char = (  $this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
        return true;
    }

    protected function skip($chars) {
        $this->pos  = strspn($this->doc, $chars, $this->pos);
        $this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
    }

    protected function copy_skip($chars) {
        $pos = $this->pos;
        $len = strspn($this->doc, $chars, $pos);
        $this->pos  = $len;
        $this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
        if ($len===0) return '';
        return substr($this->doc, $pos, $len);
    }

    protected function copy_until($chars) {
        $pos = $this->pos;
        $len = strcspn($this->doc, $chars, $pos);
        $this->pos  = $len;
        $this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
        return substr($this->doc, $pos, $len);
    }

    protected function copy_until_char($char) {
        if ($this->char===null) return '';

        if (($pos = strpos($this->doc, $char, $this->pos))===false) {
            $ret = substr($this->doc, $this->pos, $this->size-$this->pos);
            $this->char = null;
            $this->pos = $this->size;
            return $ret;
        }

        if ($pos===$this->pos) return '';
        $pos_old = $this->pos;
        $this->char = $this->doc[$pos];
        $this->pos = $pos;
        return substr($this->doc, $pos_old, $pos-$pos_old);
    }

    protected function copy_until_char_escape($char) {
        if ($this->char===null) return '';

        $start = $this->pos;
        while(1) {
            if (($pos = strpos($this->doc, $char, $start))===false) {
                $ret = substr($this->doc, $this->pos, $this->size-$this->pos);
                $this->char = null;
                $this->pos = $this->size;
                return $ret;
            }

            if ($pos===$this->pos) return '';

            if ($this->doc[$pos-1]==='') {
                $start = $pos 1;
                continue;
            }

            $pos_old = $this->pos;
            $this->char = $this->doc[$pos];
            $this->pos = $pos;
            return substr($this->doc, $pos_old, $pos-$pos_old);
        }
    }

    // remove noise from html content
    protected function remove_noise($pattern, $remove_tag=false) {
        $count = preg_match_all($pattern, $this->doc, $matches, PREG_SET_ORDER|PREG_OFFSET_CAPTURE);

        for ($i=$count-1; $i>-1; --$i) {
            $key = '___noise___'.sprintf('% 3d', count($this->noise) 100);
            $idx = ($remove_tag) ? 0 : 1;
            $this->noise[$key] = $matches[$i][$idx][0];
            $this->doc = substr_replace($this->doc, $key, $matches[$i][$idx][1], strlen($matches[$i][$idx][0]));
        }

        // reset the length of content
        $this->size = strlen($this->doc);
        if ($this->size>0) $this->char = $this->doc[0];
    }

    // restore noise to html content
    function restore_noise($text) {
        while(($pos=strpos($text, '___noise___'))!==false) {
            $key = '___noise___'.$text[$pos 11].$text[$pos 12].$text[$pos 13];
            if (isset($this->noise[$key]))
                $text = substr($text, 0, $pos).$this->noise[$key].substr($text, $pos 14);
        }
        return $text;
    }

    function __toString() {
        return $this->root->innertext();
    }

    function __get($name) {
        switch($name) {
            case 'outertext': return $this->root->innertext();
            case 'innertext': return $this->root->innertext();
            case 'plaintext': return $this->root->text();
        }
    }

    // camel naming conventions
    function childNodes($idx=-1) {return $this->root->childNodes($idx);}
    function firstChild() {return $this->root->first_child();}
    function lastChild() {return $this->root->last_child();}
    function getElementById($id) {return $this->find("#$id", 0);}
    function getElementsById($id, $idx=null) {return $this->find("#$id", $idx);}
    function getElementByTagName($name) {return $this->find($name, 0);}
    function getElementsByTagName($name, $idx=-1) {return $this->find($name, $idx);}
    function loadFile() {$args = func_get_args();$this->load(call_user_func_array('file_get_contents', $args), true);}
}
?>
บันทึกการเข้า

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