iT邦幫忙

0

【陣列範圍找值??】

  • 分享至 

  • xImage
$a = array(
'<td colspan="3" align="left"><textarea name="a" cols="66"',
'rows="2">aaa',
'bbb</textarea></td>',
'</tr>',
'<tr align="center">',
'<td bgcolor="#6699FF" class="head2">影響服務</td>',
'<td colspan="3" align="left"><textarea name="IAffectedService"',
'cols="66" rows="2">1234567',
'<td colspan="3" align="left"><textarea name="c" cols="66"',
'rows="2">ccc',
'ddd</textarea></td>',
);

假設有一個陣列像上面這樣子
我希望抓出
textarea name="a" 裡面的值

textarea name="b" 的不要

就是抓出
aaa
bbb

請問怎麼做呢
謝謝

看更多先前的討論...收起先前的討論...
來賓wiseguy大大
請接三線電話
謝謝
wiseguy iT邦超人 1 級 ‧ 2012-07-28 15:39:38 檢舉
這比教新進同仁還累吶 無言
ted99tw iT邦高手 1 級 ‧ 2012-07-28 15:48:07 檢舉
這是啥陣列啊?你們搞server side programming都是這麼慘烈嗎?無言
wiseguy iT邦超人 1 級 ‧ 2012-07-28 16:03:08 檢舉
PHP 有幾個可以讀進一整個檔案的指令,其中 file() 可以把一個檔案讀成一個陣列,檔案中每行的內容成為一個陣列元素。通常會適用在讀 ini 檔或 CSV 檔。不過樓主老兄用來讀一個 html 檔,所以結果就成這樣 ...囧

生手嘛~ 就別怪人家切肉切菜切水果,用的都是同一把刀了 ... 做菜
ted99tw iT邦高手 1 級 ‧ 2012-07-28 16:17:12 檢舉
wiseguy提到:
其中 file() 可以把一個檔案讀成一個陣列


呼,呼,我了啦~~

改天我也可以用file()來讀“小豬存摺”,或是總裁用來讀“股市大戶進出簿”,屆時要看何時存提款,總裁如何輕取大盤,就一目了然啦...XD
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

8
wiseguy
iT邦超人 1 級 ‧ 2012-07-28 15:48:54
最佳解答
  1. 看起來你是用 file() 指令去讀檔案。所以把上面那個 html 檔讀成一個無意義的陣列了。建議使用 file_get_contents() 讀成一個字串就可以處理了。

  2. 要抓 html 裡的資料,有兩種方式:
    a. 用 HTML_DOM 抓。你可以使用 PHP 的 Tidy 模組或是網路找找 php parse html 的 class 來用。這方法比較通用,不會因為 html 改變換行或大小寫,甚至添加某些元素而得重寫。
    b. 用 Regular Expression 抓。這方法簡單好用,但只適用於這個網頁內容不會有太大變化的場合。

看更多先前的回應...收起先前的回應...
andyto202 iT邦研究生 4 級 ‧ 2012-07-28 16:28:37 檢舉

wiseguy兄果然是大師
馬上被你發現
我先試試您說的
file_get_contents()
弄不出來的話
可以把原始擋給您試試嗎??

andyto202 iT邦研究生 4 級 ‧ 2012-07-28 16:38:38 檢舉

不對
我發現我是用 cURL 讀的耶
再用
foreach一行一行抓出來的

wiseguy iT邦超人 1 級 ‧ 2012-07-28 20:48:52 檢舉

如果你只是要讀取網路上某個 html 檔內容,用 cURL 是拿電鋸切豆腐 ...
需要與對方互動才用得到 cURL。單抓網頁只需要:
$a = file_get_contents('http://somewhere');
即可。

player iT邦大師 1 級 ‧ 2012-07-28 21:03:55 檢舉

要用PHP抓遠端Web上的內容嗎?
以前用的(但需要登入的網頁沒辦法抓, 因為我沒處理SessionID)
http://www.player.idv.tw/prog/index.php/HttpClient.php

andyto202 iT邦研究生 4 級 ‧ 2012-07-28 23:38:06 檢舉

因為那個網頁是公司內部的網站,是要登錄的,所以可能要用cURL才行

wiseguy iT邦超人 1 級 ‧ 2012-07-29 01:05:39 檢舉

簡單的帳密登入,file_get_contents() 還是辦得到,不必動用 cURL。參考官方站範例:
http://php.net/manual/zh/context.curl.php

另外就算一行一行抓,$a .= $result; 這樣寫還是能夠只存成一個變數即可。不過這不是重點。重點是資料存在一個變數中,比較好處理你的需求。

andyto202 iT邦研究生 4 級 ‧ 2012-07-29 11:09:16 檢舉

感謝 wiseguy 兄的回答
因為公司的網頁不是只有登錄
還要塞值過重重的網頁
所以 cURL 這是電鋸還是的出馬
只是想請目 wiseguy 兄
因為公司大部分的網頁都是表格式的
如果想抓每個<TD>裡的關鍵資料
是不是一行一行抓比較好
因為
foreach($all as $key => $line)
{

}
理論上,每個<td>資料的間距都是相同的
就可用運用 $key 加固定的值
去抓要的檔案
我目前的作法都是這樣子做的
當然
如果要的檔案不在同一行中
但是
卻要抓多筆的話

<table border="1">
<tr>
<td>a
ll
en
</td>
<td>st
eve
</td>
</tr>
<tr>
<td>bil
l
</td>
<td>
j
h
o
n
</td>
</tr>
</table>

它的格式不整齊
但是我希望把每個<tr>中不同的<td>
存成不同的變數來用
例如
allen和bill是同一組變數
steve和jhon是另一組變數
請問要怎麼做呢??

wiseguy iT邦超人 1 級 ‧ 2012-07-30 09:01:36 檢舉

答案還是上面的答案:用 Regular Expression 抓,簡單又快速:

&lt;pre class="c" name="code">&lt;?php
$t = &lt;&lt;&lt; EOB
&lt;table border="1">
&lt;tr>
&lt;td>a
ll
en
&lt;/td>
&lt;td>st
eve
&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>bil
l
&lt;/td>
&lt;td>
j
h
o
n
&lt;/td>
&lt;/tr>
&lt;/table>
EOB;

$t = str_replace("\n", '', $t); // 把換行通通去掉
preg_match_all('!&lt;tr>&lt;td>(.+)&lt;/td>&lt;td>(.+)&lt;/td>&lt;/tr>!iU', $t, $matches);
var_dump($matches);
?>

你要的兩組變數就在 $matches[1] 跟 $matches[2]。
記住,要精通 PHP,Regular Expression 非學,而且非精通不可。

我要發表回答

立即登入回答