作者 主題: preg_match() ...迴圈使用問題  (閱讀 3403 次)

0 會員 與 1 訪客 正在閱讀本文。

mars.jou

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
preg_match() ...迴圈使用問題
« 於: 2013-12-24 13:18 »
我有1個txt檔,裡面放要抓取資料的網址,
網址放1個就正常,如果放2個,第1個網址的資料就會顯示空白,第2個網址資料顯示正常,這.....是什麼原因呢?
$www = fopen("y3.txt","r");
if ($www) {
   while (($url = fgets($www,1024)) !== false) {
$fp = file_get_contents($url);
preg_match('/cl-menucate(.*?)cl-relpromo/si',$fp,$get1);
print_r($get1);
}
if (!feof($www)) {
   echo "Error: unexpected fgets() fail\n";
            }
fclose($w);
fclose($www);
}

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4908
    • 檢視個人資料
    • http://www.ecmagic.com
Re: preg_match() ...迴圈使用問題
« 回覆 #1 於: 2013-12-24 14:36 »
我有1個txt檔,裡面放要抓取資料的網址,
網址放1個就正常,如果放2個,第1個網址的資料就會顯示空白,第2個網址資料顯示正常,這.....是什麼原因呢?
$www = fopen("y3.txt","r");
if ($www) {
   while (($url = fgets($www,1024)) !== false) {
$fp = file_get_contents($url);
preg_match('/cl-menucate(.*?)cl-relpromo/si',$fp,$get1);
print_r($get1);
}
if (!feof($www)) {
   echo "Error: unexpected fgets() fail\n";
            }
fclose($w);
fclose($www);
}


將 $url, $fp echo  出來,看是否跟預期的一樣

---
既然是要每行處理,可以用 file() 讀檔然後用 foreach

mars.jou

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
Re: preg_match() ...迴圈使用問題
« 回覆 #2 於: 2013-12-24 14:58 »
Dear Yamaka,
我有用echo看過,txt檔的網址如果放1個,echo出來的資料都正常,但是放2個就不正常了.

y3.txt檔內容如下:
http://tw.buy.yahoo.com/?sub=617
http://tw.buy.yahoo.com/?sub=1

mars.jou

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
Re: preg_match() ...迴圈使用問題
« 回覆 #3 於: 2013-12-24 15:31 »
Dear Yamaka,
我試了file() & foreach(),結果一樣.

我有1個想法,雖然我們認為程式是一行一行執行,但是卻不是立即顯示,
好像程式執行完之後,再"一次顯示",
而一次顯示的結果造成第一個網址的資料被洗空了,只留下第2筆資料的內容

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4908
    • 檢視個人資料
    • http://www.ecmagic.com
Re: preg_match() ...迴圈使用問題
« 回覆 #4 於: 2013-12-24 15:32 »
Dear Yamaka,
我試了file() & foreach(),結果一樣.

我有1個想法,雖然我們認為程式是一行一行執行,但是卻不是立即顯示,
好像程式執行完之後,再"一次顯示",
而一次顯示的結果造成第一個網址的資料被洗空了,只留下第2筆資料的內容


也許抓來的網頁資料裡沒有那些關鍵字
如果沒那些關鍵字,當然就沒顯示東西

mars.jou

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
Re: preg_match() ...迴圈使用問題
« 回覆 #5 於: 2013-12-24 15:39 »
Dear Yamaka,
我試了file() & foreach(),結果一樣.

我有1個想法,雖然我們認為程式是一行一行執行,但是卻不是立即顯示,
好像程式執行完之後,再"一次顯示",
而一次顯示的結果造成第一個網址的資料被洗空了,只留下第2筆資料的內容


也許抓來的網頁資料裡沒有那些關鍵字
如果沒那些關鍵字,當然就沒顯示東西
Dear Yamaka,
    y3.txt檔只放1個網址,是有抓到資料的.

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4908
    • 檢視個人資料
    • http://www.ecmagic.com
Re: preg_match() ...迴圈使用問題
« 回覆 #6 於: 2013-12-25 11:21 »
Dear Yamaka,
我試了file() & foreach(),結果一樣.

我有1個想法,雖然我們認為程式是一行一行執行,但是卻不是立即顯示,
好像程式執行完之後,再"一次顯示",
而一次顯示的結果造成第一個網址的資料被洗空了,只留下第2筆資料的內容


也許抓來的網頁資料裡沒有那些關鍵字
如果沒那些關鍵字,當然就沒顯示東西
Dear Yamaka,
    y3.txt檔只放1個網址,是有抓到資料的.

那就在迴圈內加  ob_flush() 或 flush() 試試吧

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5370
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
Re: preg_match() ...迴圈使用問題
« 回覆 #7 於: 2013-12-25 11:32 »
應該先學怎麼除錯吧.



你應該先回答下面的問題:
1. 由檔案讀到的每一行內容跟你想的有什麼不同. (請證明)
2. 依據那一行內容去處理的動作有沒有成功. (請證明)
3. 抓回來的內容是不是跟你想的一樣. (請證明)
4. 那個內容丟給 preg_match 的結果跟你想的一不一樣. (請證明)

我的結論是, 你的程式執行的結果與你想的不一樣, 你要怎麼證明是那裡出現不一樣呢? 先找出有問題的點, 才能去思考為什麼會有問題吧.


PS.  1. 不要用 fp 當做字串的變數, 那與一般寫程式的人習慣不一樣. 通常那是名稱是有特殊含意的.
       2. 上頭那一小段程式裡就有使用沒出現過的變數, 你找的到是那一個嗎?

mars.jou

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
Re: preg_match() ...迴圈使用問題
« 回覆 #8 於: 2013-12-25 12:28 »
Dear twu2,
1. 由檔案讀到的每一行內容跟你想的有什麼不同. (請證明)...用print_r($url)
while (($url = fgets($www,1024)) !== false) {
print_r($url);

2.依據那一行內容去處理的動作有沒有成功. (請證明)...用print_r($fp)
$fp = file_get_contents($url);
print_r($fp)

3. 抓回來的內容是不是跟你想的一樣. (請證明)...用print_r($fp)...同問題2

4. 那個內容丟給 preg_match 的結果跟你想的一不一樣. (請證明)...用print_r($get1)
preg_match('/cl-menucate(.*?)cl-relpromo/si',$fp,$get1);
print_r($get1);

我的結論是, 你的程式執行的結果與你想的不一樣, 你要怎麼證明是那裡出現不一樣呢? 先找出有問題的點, 才能去思考為什麼會有問題吧.
ans:如果3.txt只有1個網址,這個討論區就不會出現這篇文章了^^,偏偏3.txt檔一定要2個以上的網址,然後就見鬼了(第1個網址的內容變空白).

2. 上頭那一小段程式裡就有使用沒出現過的變數, 你找的到是那一個嗎?
ans:$w,我沒有刪除乾淨,因為還有一段程式是寫入txt動作.

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5370
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
Re: preg_match() ...迴圈使用問題
« 回覆 #9 於: 2013-12-25 13:06 »
所以呢?
用你的資料跑的結果是什麼呢? 那一個地方出錯了呢?

file_get_contents() 一定會成功嗎? 你要怎麼確定呢?
聽起來是你無法抓到內容, 並不是 preg_match() 不能跑兩次吧.

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5370
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
Re: preg_match() ...迴圈使用問題
« 回覆 #10 於: 2013-12-25 13:15 »
對了.... fgets() 傳回來的跟你想的應該也不太一樣, 自己試看看, 並想看看是那兒不同.
直接用 fgets() 抓到的東西, 傳給 file_get_contents() 會有問題的.



上面那個找出來應該就是你的問題的解答. (只試過兩行? 依照你那個 y3.txt 的建立方式, 應該是除了最後一行之外, 其他的都不對才是....)


mars.jou

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
Re: preg_match() ...迴圈使用問題
« 回覆 #11 於: 2013-12-25 13:41 »
Dear twu2,
3.txt檔只有1個網址,結果如下(原始碼):
http://tw.buy.yahoo.com/?sub=617Array
(
   
  • => cl-menucate start templnex-->

<div id="cl-menucate" class="yui3-cssreset side-module2"><h1 class="title"><a href="/?sub=617">平板週邊</a></h1><div class="spline">&nbsp;</div><ul class=""><li class="sitelist " id="c10687-1-617">
<h3 class="stitle"><span class="star"></span><a href="/?catid=10687">強打活動</a></h3>
<ul class="" name="">
<li class="list" id=""><a href="/?catitemid=80711">iStyle 平板包5折</a></li>
<li class="list" id=""><a href="/?catitemid=87359"><span>APPLE 皮套買一送一</span></a></li>
原始碼太長,以下刪掉
-----------------------------------------分   線----------------------------------------------------
3.txt檔有2個網址,結果如下(原始碼):
http://tw.buy.yahoo.com/?sub=617
Array
(
)

http://tw.buy.yahoo.com/?sub=1Array
(
   
  • => cl-menucate start templnex-->

<div id="cl-menucate" class="yui3-cssreset side-module2"><h1 class="title"><a href="/?sub=1">筆記型電腦</a></h1><div class="spline">&nbsp;</div><ul class=""><li class="sitelist " id="c8128-1-1">
<h3 class="stitle"><span class="star"></span><a href="/?catid=8128">強打活動</a></h3>
<ul class="" name="">
<li class="list" id=""><a href="/?catitemid=81116">Intel指定機種現折1000</a></li>
<li class="list" id=""><a href="/?catitemid=22037">福利品出清</a></li>
<li class="list" id=""><a href="/?catitemid=86006">熱銷TOP.20</a></li>
原始碼太長,以下刪掉
---------------結    論-------------------
我實在是不知道為什麼2個網址就會出現第1個網址內容是空白(紅字).....

http://tw.buy.yahoo.com/?sub=617
Array
(
)

http://tw.buy.yahoo.com/?sub=1Array
(
   
  • => cl-menucate start templnex-->
« 上次編輯: 2013-12-25 13:44 由 mars.jou »

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5370
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
Re: preg_match() ...迴圈使用問題
« 回覆 #12 於: 2013-12-25 14:06 »
如果你有把我說的東西印出來, 應該就可以發現不一樣的地方.
前面就錯了, 在後面一直找問題是找不出結果的....


你不覺得你印出來的那兩個結果, 應該出現的位置不一樣嗎? 那就是一個成功一個失敗的原因.

mars.jou

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
Re: preg_match() ...迴圈使用問題
« 回覆 #13 於: 2013-12-25 14:49 »
Dear twu2,
    看完你的回復,腦袋突然靈光一閃,為何使用2個網址時,顯示出來的結果,第1個網址的後面會有換行動作???
難道fgets()連換行字元都讀進去???測試結果果然沒錯....
加了trim()之後就正常了....
最後....感謝這段時間來大家的幫助,萬分感謝!!!!