Simple HTML DOM Parserで再帰処理100回エラー
まずは結論。
何が起きたのかっていうと色んなサイトをパースしてたら下記のようなエラーが発生した。
調べると再帰処理を100回以上するとでてくるらしい。
そもそも再帰処理なんてやってないっていうより…「再帰処理って何?」って感じなんだよね。
再帰処理について
「自分で自分自身を実行する」とか意味不明な説明が多い。
サンプルソースを探しても長くて解読が面倒。
たまたま見つけたサンプルソース(URL控えるのを忘れた…)のおかげで何となく理解できた。
理解できたけど普通にループじゃダメなのかな?
使いドコは不明だけど今回は気にしない。
- function recursion($a){
- if ($a < 50) {
- echo "{$a}\n";
- recursion($a + 1);
- }
- }
- recursion(1);
Simple HTML DOM Parserの再帰処理
「$dom->plaintext」とかやるとSimple HTML DOM Parserの中で「__get()」とかが実行されていてそこで再帰処理が使われているっぽい。
エラーの考えられる原因の切り分け
「(自作の)スクリプト」から「対象のHTMLファイル」を「Simple HTML DOM Parser」にいれて「$dom->plaintext」をやってウニョウニョしているので「(自作の)スクリプト」と「Simple HTML DOM Parser」と「対象のHTMLファイル」のどれかが原因。
原因の可能性1:(自作の)スクリプト
このエラーの原因と考えられる可能性の高いのは「(自作の)スクリプト」。
アレコレ削っていったんだけど…原因不明。(かなりシンプルなスクリプトに変更してもダメ)
原因の可能性2:対象のHTMLファイル
次に考えられる可能性の高いのは「対象のHTMLファイル」。
ココでは、ファイル容量・文字数・タグ数・変なタグをチェック。
ファイル容量・文字数・タグ数は今まで調べてきたHTMLファイルに比べるとそれほど多くは無いように見える。
変なタグないかなぁと調べると「<wbr>」ってのを大量に発見。
特別興味ないタグなので削除したらエラーが出なくなった。
対処
「<wbr>の個数」と「タグの数」が100個、もしくは、タグを100種類使うとアウトっぽいような気がするけど…わかんないや。
新たなる問題
「<wbr>」を削除してパースしてたのに再度、再帰処理のエラー。
今度は「<area>」がいっぱい。いっぱいといっても80個弱程度。
対処2
考えるのが面倒なので空タグを削除することにした。
ほしいのはプレインテキストなので空タグは興味無いんだよね。
$str = str_ireplace(array('<wbr>', '<br>', '<br />'), "", $str);
$str = preg_replace('/(<img )(\w+)([^<>]*>)/iu', '', $str);
$str = preg_replace('/(<area )(\w+)([^<>]*>)/iu', '', $str);
$dom = str_get_html($str);
上記のような感じにしてみた。
空タグについて
内容が存在しないタグではなく、閉じタグの存在しないタグのこと。
※表現が適しているが不明なので下記に例を示してみる。
※「からタグ」なのか「そらタグ」なのかは知らない。多分「からタグ」だと思う。
<h1>reCatnap</h1>や<p>reCatnap</p>など。
■内容が存在しないタグ
<h1></h1>や<p></p>など。
■空タグ(閉じタグが存在しない・不要?)
<img src="">や<area href="">、<br>など。