お世話になります。
考えて考えて考えたのですが原因がわからないので、どなたかわかる方、ご教示いただきたいと思います。
PHPとlinuxを用いて、以下のルールでHTMLをフレーズとタグに分離したいと思います。
HTMLのフレーズ部を独自の記号 (例:TAG_1234)に置換して、タグも分離して配列に入力します。
そのあと配列データを再度置換する形で、元のデータに戻したいです。
例として:
<body> <p>I have many <a href="./beautiful.html">beautiful chopsticks</a>.</p> <table> <tr> <td>cat1</td> <td><a href="./2">cat2</a></td> </tr> </table> </body>
↓
<body> <p>I have many <a href="./beautiful.html"> TAG_1 </a></p> <table> <tr> <td> TAG_2 </td> <td><a href="./2"> TAG_3 </a></td> </tr> </table> </body>
↓
<body> <p>I have many TAG_4 </p> <table> <tr> TAG_5 <td>TAG_6</td> </tr> </table> </body>
↓<br>
:<br>
次の置換は I have many TAG_4
を TAG_6
に、最後には、<body> TAG_(XXX) </body>
を TAG_(XXX+1)
に置換します。
置換したフレーズを格納した配列は、
$result_phrase=array(//フレーズ部 'TAG_1'=>"beautiful chopsticks", 'TAG_2'=>"cat1", : 'TAG_6'=>"I have many TAG_4", : ); $result_tag=array(//タグ部 'TAG_4'=>"<a href="./bueautiful.html"> TAG_1 </a>", 'TAG_5'=>"<td> TAG_2 </td>", : );
のような形となるはずです。
このようなパースと再構築を実現するために、PHPで正規表現を使用して以下のようなコードを作成しました。
<?php function str_replace_first($from,$to,$content){ $from = '/'.preg_quote($from, '/').'/'; return preg_replace($from, $to, $content, 1); } function html_parse($html){ $result_tag = array();//tag container $result_phrase = array();//phrase container $pattern_tag = '#(<[^>]+?> T_[0-9]+? </[^>]+?>)#';//tag finder $pattern_phrase = '#<[^>]+?>([^<]+?)</[^>]+?>#';//phrase finder $control = 1;//再帰処理回数 $num = 0;//置換回数 while ($control<10) { $precon = count($result_tag) + count($result_phrase); $start = 0; while (preg_match_all($pattern_tag, $html, $match_tag)) { foreach ($match_tag[1] as $m) { $result_tag[$num] = $m; $html = str_replace_first($m, " T_{$num} ", $html); $num++; } //foreach end } //if pregmatch end if (preg_match_all($pattern_phrase, $html, $match_phrase)) { foreach ($match_phrase[1] as $m) { $result_phrase[$num] = $m; $html = str_replace_first($m, " T_{$num} ", $html); //echo $m; $num++; } //foreach end } //if end $control=count($result_tag) + count($result_parse)- $precon; } return array('tag'=>$result_tag,'phrase'=>$result_phrase); } //HTMLのパース $parse=$html_parse($html); $result_tag=$parse['tag']; $result_phrase=$parse['phrase']; //HTMLの再構築 $in_arr = array_merge($result_tag,$result_phrase); for ($num = count($in_arr) - 1; $num >= 0; $num--) { $html = str_replace_first("T_{$num}", $in_arr[$num], $html); } echo $html;//最初のHTMLと同じものがechoされるはず
想定では、このコードでechoされるのは最初のHTMLと同じものとなるはずです。
しかし、複数のwebページで実行したところ、同じものとなりませんでした。
コードのどこがおかしいのか、ご教示ください。
また、こんな複雑な方法を使わなくてももっと簡単に
$result_phrase=array(//フレーズ部 'TAG_1'=>"beautiful chopsticks", 'TAG_2'=>"cat1", : 'TAG_6'=>"I have many TAG_4", : ); $result_tag=array(//タグ部 'TAG_4'=>"<a href="./bueautiful.html"> TAG_1 </a>", 'TAG_5'=>"<td> TAG_2 </td>", : );
の様に分離する方法がありましたら、お教えいただけると幸いです。
読んでいただきありがとうございました。
よろしくお願いいたします。