0

我会给你要点的。

我正在尝试使用第三方 HTML 标签剥离器抓取某些 URL ,因为我认为默认的 strip_tags() 不能很好地完成这项工作。(我认为你不需要检查那个刮板)

现在有时,某些网站的 HTML 源代码包含一些奇怪的代码,导致我的 HTML 标签剥离器失败。

一个这样的例子是这个包含以下代码的站点:

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

这导致上述标签剥离器抛出此错误:

解析错误:语法错误,意外的 T_ENCAPSED_AND_WHITESPACE,期望/var/www/GET Tweets/htdocs/tmhOAuth-master/examples/class.html2text.inc(429)中的 T_STRING 或 T_VARIABLE 或 T_NUM_STRING :第1行的正则表达式代码

致命错误:preg_replace () [<a href='function.preg-replace'>function.preg-replace</a>]:评估代码失败:$this->_build_link_list("<//?=$cnf[\' website\']?>girls/models-photo-gallery/?sType=6#top_menu", "Photo Gallery") 在/var/www/GET Tweets/htdocs/tmhOAuth-master/examples/class.html2text。公司上线 429

现在发生的情况是,有许多 URL 数组,其中一些会抛出上述错误。我对每个 URL 进行一些处理。

如果数组中的某个 URL 抛出这样的错误,我希望执行继续处理下一个 URL,而不会干扰任何东西。我的代码是这样的:

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

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

这里 myfunc 进行处理并使用我之前提到的第 3 方 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 块?

4

2 回答 2

0

我建议你在解析之前使用一些美化脚本,比如Tidy 。你的问题可以通过添加来解决

$html_content = htmlspecialchars($html_content)
于 2012-11-26T08:14:15.920 回答
-1

您无法捕获解析错误(或任何致命错误,但解析错误更糟糕,因为它们会在代码加载后立即生成)。我所知道的隔离它们的最好方法是运行完全独立的 PHP 进程来处理您想要从中恢复并期望生成致命错误的任何内容。

另请参阅如何捕获 PHP 致命错误

于 2012-11-26T08:17:35.950 回答