php ลบคำตั้งแต่เริ่มจันจบยังไงครับ

เริ่มโดย ThaNaButS, 16 พฤษภาคม 2008, 20:55:09

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

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

ThaNaButS

เช่นให้ php ดึงข้อความมาว่า

thaiseoboard<table><tr><td>0000000000000</td></tr></table>
เสียววุ้ย<table><tr><td>9999999999999</td></tr></table>
เสียวอีกแระ<table><tr><td>111111111</td></tr></table>
ข้อความต่อไป<table><tr><td>...โค๊ด.....</td></tr></table>
.....
ปล.ในการดึงข้อความแต่ละครั้งจะไม่เหมือนกันนะครับ
ประมาณนี้ไปเรื่อยๆ

และผมจะให้มันลบเหลือ


thaiseoboard
เสียววุ้ย
ข้อความต่อไป
...


สรุปคือสั่งลบตั้งแต่ <table> จนจบถึง </table>

TheboY

ถ้าแบบง่าย ๆ ถึก ๆ นะครับ

1. ใช้ str_replace เปลี่ยน <table>  เป็น , (คอมม่า)

2. แล้วสร้างไพล์ temp ขึ้นมา (กำหนดนามสกุลให้เป็น .csv [หรือไม่ก็ได้]) fput ที่ข้อมูลที่เปลี่ยนแล้ว

3. ใช้ getcsv อ่านไฟล์ที่ได้ในข้อ 2 แล้ว เอามาใช้แค่ตัวแรก

4. ลบไฟล์ temp ออก

5. จบ

เข้าใจป่ะครับ


ball6847

test test

<?

//header("Content-type: text/plain");

$test = <<< HTML
thaiseoboard<table><tr><td>0000000000000</td></tr></table>
เสียววุ้ย<table><tr><td>9999999999999</td></tr></table>
เสียวอีกแระ<table><tr><td>111111111</td></tr></table>
ข้อความต่อไป<table><tr><td>...โค๊ด.....</td></tr></table>
HTML;

$regex = "|(.*)<table><tr><td>.*</td></tr></table>\s?|";
preg_match_all($regex,$test,$match);

print_r($match);

?>


output

Array
(
    [0] => Array
        (
            [0] => thaiseoboard<table><tr><td>0000000000000</td></tr></table>
            [1] => เสียววุ้ย<table><tr><td>9999999999999</td></tr></table>
            [2] => เสียวอีกแระ<table><tr><td>111111111</td></tr></table>
            [3] => ข้อความต่อไป<table><tr><td>...โค๊ด.....</td></tr></table>
        )

    [1] => Array
        (
            [0] => thaiseoboard
            [1] => เสียววุ้ย
            [2] => เสียวอีกแระ
            [3] => ข้อความต่อไป
        )

)


พอเข้าใจป่ะคับ

พอเวลาเอาไปใช้ ข้อความที่คุณต้องการจะอยู่ใน array $match[1]
และก็รอให้เอาไปต้มยำทำแกงต่อไป

ลองดูตัวอย่างละกันคับ ไม่เข้าใจตรงไหนลองถามดูคับ ถ้าไม่เหลือบ่ากว่าแรงจะช่วยตอบ
We use Ubuntu.

[direct=http://ng-seo.sourcelab.xyz/]AngularJS SEO Experimental[/direct]

เกรียนเทพ


ThaNaButS

อ้างถึงจาก: ball6847 ใน 16 พฤษภาคม 2008, 21:34:41
test test

<?

//header("Content-type: text/plain");

$test = <<< HTML
thaiseoboard<table><tr><td>0000000000000</td></tr></table>
เสียววุ้ย<table><tr><td>9999999999999</td></tr></table>
เสียวอีกแระ<table><tr><td>111111111</td></tr></table>
ข้อความต่อไป<table><tr><td>...โค๊ด.....</td></tr></table>
HTML;

$regex = "|(.*)<table><tr><td>.*</td></tr></table>\s?|";
preg_match_all($regex,$test,$match);

print_r($match);

?>


output

Array
(
    [0] => Array
        (
            [0] => thaiseoboard<table><tr><td>0000000000000</td></tr></table>
            [1] => เสียววุ้ย<table><tr><td>9999999999999</td></tr></table>
            [2] => เสียวอีกแระ<table><tr><td>111111111</td></tr></table>
            [3] => ข้อความต่อไป<table><tr><td>...โค๊ด.....</td></tr></table>
        )

    [1] => Array
        (
            [0] => thaiseoboard
            [1] => เสียววุ้ย
            [2] => เสียวอีกแระ
            [3] => ข้อความต่อไป
        )

)


พอเข้าใจป่ะคับ

พอเวลาเอาไปใช้ ข้อความที่คุณต้องการจะอยู่ใน array $match[1]
และก็รอให้เอาไปต้มยำทำแกงต่อไป

ลองดูตัวอย่างละกันคับ ไม่เข้าใจตรงไหนลองถามดูคับ ถ้าไม่เหลือบ่ากว่าแรงจะช่วยตอบ

ในตอนเรียกใช้อะครับทำไงอะ "พอเวลาเอาไปใช้ ข้อความที่คุณต้องการจะอยู่ใน array $match[1]"
เอาไป echo $match[1] ได้เลยไมครับ

ball6847

อ้างถึงจาก: ThaNaButS ใน 16 พฤษภาคม 2008, 21:45:59

ในตอนเรียกใช้อะครับทำไงอะ "พอเวลาเอาไปใช้ ข้อความที่คุณต้องการจะอยู่ใน array $match[1]"
เอาไป echo $match[1] ได้เลยไมครับ

ไม่ได้คับ เพราะว่า $match[1] ยังเป็น array อยู่คับ หากต้องการเข้าถึงค่าที่เก็บอยู่ใน array ถ้าไม่ใช้ foreach ก็ต้องเข้าถึงแบบระบุ คีย์คับ

สมมุติ


<?php

//header("Content-type: text/plain");

$test file_get_contents('http://domain.com/iwillget.php');

$regex "|(.*)<table><tr><td>.*</td></tr></table>\s?|";
preg_match_all($regex,$test,$match);

$msg $match[1];

echo 
$msg[0];
echo 
$msg[1];
echo 
$msg[2];
echo 
$msg[3];

// or foreach

foreach($msg as $text)
{
   echo 
$text;
}

?>



ลองดูจากโค้ดข้างบนคือ ที่ echo ทีแรก คือแบบระบุคีย์ (ก่อนนั้นผมเก็บค่าที่ match มาไว้ใน $msg ก่อน เพื่อให้ไม่งง เพราะงั้น $msg ก็ยังเป็น array อยู่นะคับ)

สมมุตผมต้องการเข้าถึง ค่าตัวที่ 1 ที่เก็บไว้ใน array $msg ผมก็จะเข้าถึงโดย $msg[0]
ค่าใน array ตัวที่ 2 ก็จะเข้าถึงโดย $msg[1] ... เป็นอย่างงี้เรื่อยๆไปจนสมาชิกตัวสุดท้ายอ่ะคับ

เพราะงั้น จากตัวอย่าง

echo $msg[0]; <== สั่งให้แสดง "thaiseoboard"
echo $msg[1]; <== สั่งให้แสดง "เสียววุ้ย"
echo $msg[2]; <== สั่งให้แสดง "เสียวอีกแระ"
echo $msg[3]; <== สั่งให้แสดง "ข้อความต่อไป"

หวังว่าน่าจะเข้าใจนะคับ  :P

กับอีกแบบที่เราต้องการ เข้าถึงทุกสมาชิกใน array เลย เราจะใช้ foreach

foreach($msg as $text) <== หมายถึง เก็บแต่ละสมาชิกใน $msg เป็น $text
{
   echo $text; <== สั่งให้แสดง $text แต่ละตัว ซึ่งแต่ละรอบก็จะเป็นสมาชิกแต่ละตัวของ $msg
}

จะเข้าใจมั้ยเนี่ย

ปล. ต้องขอโทษก่อนที่ต้องอธิบายยาว เพราะ อยากให้เข้าใจมากกว่าการทำให้ดูเป้นเคสๆ ไปอ่ะคับ
We use Ubuntu.

[direct=http://ng-seo.sourcelab.xyz/]AngularJS SEO Experimental[/direct]

monster

จะทำอะไรให้ยุ่งยากล่ะครับ

<?php
$txt 
'thaiseoboard<table><tr><td>0000000000000</td></tr></table>
เสียววุ้ย<table><tr><td>9999999999999</td></tr></table>
เสียวอีกแระ<table><tr><td>111111111</td></tr></table>
ข้อความต่อไป<table><tr><td>...โค๊ด.....</td></tr></table>'
;
echo 
preg_replace('/<table>(.*)?<\/table>/','',$txt);
?>


ลองดู

;D

ball6847

สงสัยผมจะทำให้ยุงยากจิงๆด้วย  :P

เอาแบบง่ายๆก็ได้คับ  :P
We use Ubuntu.

[direct=http://ng-seo.sourcelab.xyz/]AngularJS SEO Experimental[/direct]

เกรียนเทพ

อ้างถึงจาก: monster ใน 16 พฤษภาคม 2008, 22:14:22
จะทำอะไรให้ยุ่งยากล่ะครับ

<?php
$txt 
'thaiseoboard<table><tr><td>0000000000000</td></tr></table>
เสียววุ้ย<table><tr><td>9999999999999</td></tr></table>
เสียวอีกแระ<table><tr><td>111111111</td></tr></table>
ข้อความต่อไป<table><tr><td>...โค๊ด.....</td></tr></table>'
;
echo 
preg_replace('/<table>(.*)?<\/table>/','',$txt);
?>


ลองดู

;D

สั้น ๆ แต่ถ้าคนไม่เข้าใจนี่ยากเลยนะครับ คงต้องเพิ่มอีกเยอะเลย มันตัดไห้ไม่หมด

:D

EThaiZone

#9
<?php
$txt 
'thaiseoboard<table><tr><td>0000000000000</td></tr></table>
เสียววุ้ย<table><tr><td>9999999999999</td></tr></table>
เสียวอีกแระ<table><tr><td>111111111</td></tr></table>
ข้อความต่อไป<table><tr><td>...โค๊ด.....</td></tr></table>
ข้อความกับลิงค์<table><tr><td><a href="http://www.google.com">...โค๊ด.....</a></td></tr></table>'
;
echo 
preg_replace('#(<[^>]+>)+([^<])+(</[^>]+>)+#','',$txt);
?>


:P

ปล. ไปเรียนแระ สัปดาห์หน้าปิดเทอมแว้ว  :D (แต่ปิดแค่ 2 สัปดาห์ บ้าจัง - -*)

monster

ไม่แน่ใจในวัตถุประสงค์ครับ ไม่รู้ว่า จขกท. ต้องการตัดเฉพาะ <table>...</table> หรือตัด html ทิ้งให้หมด เหลือแต่ text ล่ะครับ

ลองดูตัวอย่าง robots ที่เขียนมาแบบลวก ๆ ของผมละกันครับ เป็นตัวอย่างการดึงหัวข้อโพสล่าสุดในบอร์ดนี้  ;D

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
  <TITLE>Robots</TITLE>
  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
</HEAD>
<BODY>
<?php
$url 
'http://www.thaiseoboard.com'//กำหนด url เป้าหมาย

//ดึงข้อมูลหน้าเพจเป้าหมาย
$oh curl_init();
curl_setopt($ohCURLOPT_RETURNTRANSFER1);
curl_setopt($ohCURLOPT_URL$url);
$data curl_exec($oh);//ข้อมูลหน้าเพจจะถูกเก็บในตัวแปร data
curl_close($oh);

$num preg_match_all("/<td valign=\"top\">([^`]*?)<\/td>/",$data,$idata);//ดึงข้อมูลที่อยู่ระหว่าง <td valign="top">.....</td>
for($i=0$i<=$num-1$i++){ //วน loop เพื่อเก็บข้อมูลทั้งหมด
$txt $idata[0][$i];
$txt strip_tags($txt); //ตัด html tag ออกทั้งหมดให้เหลือเพียง text
$txts .= $txt.'<br>'//นำ array มารวมกันเป็นตัวแปรเดียว
}
echo 
$txts//แสดงผล
?>

</BODY>
</HTML>


ไม่รู้ว่าจะตรงกับความต้องการรึเปล่านะ

thenetxx

Develop site but can't develop life
ASIA

ThaNaButS

#12
อ้างถึงจาก: monster ใน 17 พฤษภาคม 2008, 11:22:38
ไม่แน่ใจในวัตถุประสงค์ครับ ไม่รู้ว่า จขกท. ต้องการตัดเฉพาะ <table>...</table> หรือตัด html ทิ้งให้หมด เหลือแต่ text ล่ะครับ

ลองดูตัวอย่าง robots ที่เขียนมาแบบลวก ๆ ของผมละกันครับ เป็นตัวอย่างการดึงหัวข้อโพสล่าสุดในบอร์ดนี้  ;D

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
  <TITLE>Robots</TITLE>
  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
</HEAD>
<BODY>
<?php
$url 
'http://www.thaiseoboard.com'//&#3585;&#3635;&#3627;&#3609;&#3604; url &#3648;&#3611;&#3657;&#3634;&#3627;&#3617;&#3634;&#3618;

//&#3604;&#3638;&#3591;&#3586;&#3657;&#3629;&#3617;&#3641;&#3621;&#3627;&#3609;&#3657;&#3634;&#3648;&#3614;&#3592;&#3648;&#3611;&#3657;&#3634;&#3627;&#3617;&#3634;&#3618;
$oh curl_init();
curl_setopt($ohCURLOPT_RETURNTRANSFER1);
curl_setopt($ohCURLOPT_URL$url);
$data curl_exec($oh);//&#3586;&#3657;&#3629;&#3617;&#3641;&#3621;&#3627;&#3609;&#3657;&#3634;&#3648;&#3614;&#3592;&#3592;&#3632;&#3606;&#3641;&#3585;&#3648;&#3585;&#3655;&#3610;&#3651;&#3609;&#3605;&#3633;&#3623;&#3649;&#3611;&#3619; data
curl_close($oh);

$num preg_match_all("/<td valign=\"top\">([^`]*?)<\/td>/",$data,$idata);//&#3604;&#3638;&#3591;&#3586;&#3657;&#3629;&#3617;&#3641;&#3621;&#3607;&#3637;&#3656;&#3629;&#3618;&#3641;&#3656;&#3619;&#3632;&#3627;&#3623;&#3656;&#3634;&#3591; <td valign="top">.....</td>
for($i=0$i<=$num-1$i++){ //&#3623;&#3609; loop &#3648;&#3614;&#3639;&#3656;&#3629;&#3648;&#3585;&#3655;&#3610;&#3586;&#3657;&#3629;&#3617;&#3641;&#3621;&#3607;&#3633;&#3657;&#3591;&#3627;&#3617;&#3604;
$txt $idata[0][$i];
$txt strip_tags($txt); //&#3605;&#3633;&#3604; html tag &#3629;&#3629;&#3585;&#3607;&#3633;&#3657;&#3591;&#3627;&#3617;&#3604;&#3651;&#3627;&#3657;&#3648;&#3627;&#3621;&#3639;&#3629;&#3648;&#3614;&#3637;&#3618;&#3591; text
$txts .= $txt.'<br>'//&#3609;&#3635; array &#3617;&#3634;&#3619;&#3623;&#3617;&#3585;&#3633;&#3609;&#3648;&#3611;&#3655;&#3609;&#3605;&#3633;&#3623;&#3649;&#3611;&#3619;&#3648;&#3604;&#3637;&#3618;&#3623;
}
echo 
$txts//&#3649;&#3626;&#3604;&#3591;&#3612;&#3621;
?>

</BODY>
</HTML>


ไม่รู้ว่าจะตรงกับความต้องการรึเปล่านะ

55+รู้ได้ไงอะคับ

ขอขอบคุณทุกคำตอบมิตรภาพทั้งนั้น

ThaNaButS

#13
หุหุช่วยอีกหน่อยนะครับ

okfsdfsdfofdsfsokok|#@|abc123


อบากให้มันตัดเหลือแค่ abc123

ปล. okfsdfsdfofdsfsokok  รูปแบบไม่เหมือนกัน

EThaiZone