0

我會給你的要點。如果函數在PHP中引發致命錯誤,如何在下一個循環中繼續執行?

我想使用third party HTML tag stripper刮取某些URL,因爲我不認爲默認的strip_tags()能很好地完成這項工作。 (我不認爲你需要檢查該刮板)

現在有些時候,一些網站的HTML源代碼包含一些奇怪的代碼,導致我的HTML標籤剝離失敗。

一個這樣的例子是this site包含下面的一段代碼:

<li><a href="<//?=$cnf['website']?>girls/models-photo-gallery/?sType=6#top_menu">Photo Galleries</a></li> 

導致上述標籤汽提塔以引發此錯誤:

解析錯誤:語法錯誤,意外的 T_ENCAPSED_AND_WHITESPACE,期待T_STRING或T_VARIABLE或 T_NUM_STRING位於/var/www/GET Tweets/htdocs/tm hOAuth主/示例/ class.html2text.inc(429):在線路 的regexp代碼

致命錯誤: 的preg_replace()<一個 HREF = 'function.preg-替換' >功能.preg-replace </a >]: 評估代碼失敗: $ this- & gt; _build_link_list(& quot; & lt; //?= $ cnf [\'website \']? & GT;女孩/模型-光廊/ STYPE = 6#top_menu & QUOT ;, & QUOT;圖集& QUOT;在/VAR)/網絡/ GET 鳴叫/ htdocs中/ tmhOAuth主/示例/ class.html2text.inc在線

現在發生的事情是,有很多的URL的數組,有的拋出上述錯誤。我對每個網址做了一些處理。

如果數組中的某個URL引發這樣的錯誤,我希望執行繼續處理下一個URL,而不會干擾任何內容。我的代碼是這樣的:

foreach ($results as $result) 
{ 
    $url=$result->Url; 

    $worddict2=myfunc($url,$worddict2,$history,$n_gram);   
} 

這裏myfunc處理並使用我提到的第三方HTML脫衣舞。 我試過的代碼修改,以這樣的:

foreach ($results as $result) 
    { 
     $url=$result->Url; 
     $worddicttemp=array(); 
     try 
     { 
      $worddicttemp=myfunc($url,$worddict2,$history,$n_gram); //returns the string represenation of what matters, hopefully 
      //The below line will be executed only when the above function doesn't throw a fatal error 
      $worddict2=$worddicttemp; 
     } 
     catch(Exception $e) 
     { 
      continue; 
     } 
    } 

但是我仍然得到同樣的錯誤。 有什麼不對?爲什麼myfunc()中的代碼在遇到致命錯誤時立即將控制權轉移給catch塊?

+0

使用到的strstr檢查,如果你有$ worddicttemp錯誤,如果true,則使用繼續轉到下一個網址 –

+0

,它使用的preg_replace「E」修飾是很百搭HTML脫衣舞。我會尋找其他的解決方案,因爲正在討論的功能正在走向渡渡鳥的道路。 – cleong

+0

我相信preg_ *的eval修飾符遲早會被移除,現在可能會更好。 – Dale

回答

-1

你抓不到解析錯誤(或與此有關的任何致命錯誤,但錯誤解析甚至更糟,因爲他們會盡快生成的代碼加載來解決)。我知道隔離它們的最好方法是運行完全獨立的PHP進程,無論您希望從中恢復什麼,並期望產生致命錯誤。

又見How do I catch a PHP Fatal Error

0

我建議你在解析之前使用一些美化腳本,如Tidy。而你的問題可以通過添加

$html_content = htmlspecialchars($html_content) 
相關問題