はじめての親子ハイキングに挑戦!! >>

正規表現で

<!DOCTYPE html>
<html>


・(略)
<table>
<th>123</th>
<td class="123">123</td>
<th>456</th>
<td class="456">456</td>
<th>789</th>
<td class="789">789</td>
</table>
</html>

このHTMLソースが
$TABLEに入っているとき、

まず上記のテーブルから
<td class="123">123</td>
<td class="456">456</td>
<td class="789">789</td>

<td>??</td>を抽出し

さらに、そこから
123,456,789

と、このように<td>間にある、文字列を
カンマ区切りでしたいです。

お力添えをお願い致します。

質問者からの補足コメント

  • なんとなくわかりました。
    完全に理解したか?と言われると痛いところですが、
    下記のようにすると
    実行できました。

    $TABLE = join(',', $content =~ m!<td.*?>(\w+?)<\/td>!g);

    しかし、質問にはなかったのですが、
    <td class="123><a href="???">123</a></td>
    のとき、消えています、この場合どうするのでしょうか?

    No.2の回答に寄せられた補足コメントです。 補足日時:2017/09/26 16:21

A 回答 (4件)

正規表現でもある程度はできます。



my @words;
while ($TABLE =~ m#<td.*?>(.+?)</td>#gs) {
my $word = $1;
$word =~ s/<.+?>//g;
$word =~ s/^\s+|\s+$//g;
$word =~ s/\s+/ /g;
push(@words, $word) if $word;
}
print join(',', @words) . "\n";

ですが、この手の処理は正規表現では荷が重いので、
HTML 解析用のモジュールを利用することをお勧めします。
http://search.cpan.org/~mirod/HTML-TreeBuilder-X …
    • good
    • 0

「この場合どうするのでしょうか」って言われても... そういう場合, あなたはどうなってほしいんですか?



この手の話は本来正規表現には不向きなので, 「非常に単純」でないならさっさとあきらめて DOM とか XPath を使うことを考えるべきでしょう.
    • good
    • 0

そりゃそうだろうねぇ....



例えば
print $TABLE ;
という文が何をしているか理解できていますか?
この回答への補足あり
    • good
    • 0
この回答へのお礼

わからないです・・・
単純に
$TABLE内の<td ??>数字</td>
をカンマでつなぐ処理だと思い

その後にprintすると、それが表示されるもんだと・・・

お礼日時:2017/09/26 13:53

「(略)」の部分にもよるけど例えば


join(',', $TABLE =~ m!<td.*?>(\d+?)</td>!g)
とか?
    • good
    • 0
この回答へのお礼

略の部分によるというのが影響しているんでしょうか・・?
もしくは使い方を間違っているのでしょうか?

$TABLE = HTMLソース全て
join(',', $TABLE =~ m!<td.*?>(\d+?)<\/td>!g);
print $TABLE ;

試したとこ、全てのソースが表示されています。

お礼日時:2017/09/26 12:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング