HTMLの<table>内の<tr><td>から必要な情報を取得したいのですが、
正規表現チェッカーでは正しい結果が 2次元配列に繰り返しで入るのですが、
Eclipseでは、全体がarray[0][0]にマッチしてしまい、array[1][0]、array[2][0]... は最終行しか取れてない状況です。
元データ
<tr class="a"><td class="b">1</td><td class="c">1</td><td class="d"><a href="test1">test1</a></td><td class="e">1</td><td class="f"><a href="test1">test1</a></td></tr>
<tr class="a"><td class="b">2</td><td class="c">2</td><td class="d"><a href="test2">test2</a></td><td class="e">2</td><td class="f"><a href="test2">test2</a></td></tr>
<tr class="a"><td class="b">3</td><td class="c">3</td><td class="d"><a href="test3">test3</a></td><td class="e">3</td><td class="f"><a href="test3">test3</a></td></tr>
正規表現
preg_match_all('@<tr.*><td.*>(.*)<\/td><td.*>(.*)<\/td><td.*>(<a.*>.*<\/a>)<\/td><td.*>(.*)<\/td><td.*>(<a.*>.*<\/a>)<\/td><\/tr>@', $html, $matches);
htmlは mb_convert_encodingでUTF-8に変更してから、改行、タブを削除してます。
どなたかわかる方いらっしゃいましたらご教授お願いします。
\s*(.*)\s*
の部分、こうしてみたらどうでしょう。
\s*([^<\s]*)\s*
.*
が強くマッチするからです。<?php $html = '<tr class="a"><td class="b">1</td><td class="c">1</td><td class="d"><a href="test1">test1</a></td><td class="e">1</td><td class="f"><a href="test1">test1</a></td></tr><tr class="a"><td class="b">2</td><td class="c">2</td><td class="d"><a href="test2">test2</a></td><td class="e">2</td><td class="f"><a href="test2">test2</a></td></tr><tr class="a"><td class="b">3</td><td class="c">3</td><td class="d"><a href="test3">test3</a></td><td class="e">3</td><td class="f"><a href="test3">test3</a></td></tr>'; preg_match_all('@<tr.*><td.*>(.*)<\/td><td.*>(.*)<\/td><td.*>(<a.*>.*<\/a>)<\/td><td.*>(.*)<\/td><td.*>(<a.*>.*<\/a>)<\/td><\/tr>@U', $html, $matches); var_dump($matches);
array(6) { [0]=> array(3) { [0]=> string(167) "<tr class="a"><td class="b">1</td><td class="c">1</td><td class="d"><a href="test1">test1</a></td><td class="e">1</td><td class="f"><a href="test1">test1</a></td></tr>" [1]=> string(167) "<tr class="a"><td class="b">2</td><td class="c">2</td><td class="d"><a href="test2">test2</a></td><td class="e">2</td><td class="f"><a href="test2">test2</a></td></tr>" [2]=> string(167) "<tr class="a"><td class="b">3</td><td class="c">3</td><td class="d"><a href="test3">test3</a></td><td class="e">3</td><td class="f"><a href="test3">test3</a></td></tr>" } [1]=> array(3) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" } [2]=> array(3) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" } [3]=> array(3) { [0]=> string(25) "<a href="test1">test1</a>" [1]=> string(25) "<a href="test2">test2</a>" [2]=> string(25) "<a href="test3">test3</a>" } [4]=> array(3) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" } [5]=> array(3) { [0]=> string(25) "<a href="test1">test1</a>" [1]=> string(25) "<a href="test2">test2</a>" [2]=> string(25) "<a href="test3">test3</a>" } }
\s*(.*)\s*
の部分、こうしてみたらどうでしょう。
\s*([^<\s]*)\s*
.*
が強くマッチするからです。<?php $html = '<tr class="a"><td class="b">1</td><td class="c">1</td><td class="d"><a href="test1">test1</a></td><td class="e">1</td><td class="f"><a href="test1">test1</a></td></tr><tr class="a"><td class="b">2</td><td class="c">2</td><td class="d"><a href="test2">test2</a></td><td class="e">2</td><td class="f"><a href="test2">test2</a></td></tr><tr class="a"><td class="b">3</td><td class="c">3</td><td class="d"><a href="test3">test3</a></td><td class="e">3</td><td class="f"><a href="test3">test3</a></td></tr>'; preg_match_all('@<tr.*><td.*>(.*)<\/td><td.*>(.*)<\/td><td.*>(<a.*>.*<\/a>)<\/td><td.*>(.*)<\/td><td.*>(<a.*>.*<\/a>)<\/td><\/tr>@U', $html, $matches); var_dump($matches);
array(6) { [0]=> array(3) { [0]=> string(167) "<tr class="a"><td class="b">1</td><td class="c">1</td><td class="d"><a href="test1">test1</a></td><td class="e">1</td><td class="f"><a href="test1">test1</a></td></tr>" [1]=> string(167) "<tr class="a"><td class="b">2</td><td class="c">2</td><td class="d"><a href="test2">test2</a></td><td class="e">2</td><td class="f"><a href="test2">test2</a></td></tr>" [2]=> string(167) "<tr class="a"><td class="b">3</td><td class="c">3</td><td class="d"><a href="test3">test3</a></td><td class="e">3</td><td class="f"><a href="test3">test3</a></td></tr>" } [1]=> array(3) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" } [2]=> array(3) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" } [3]=> array(3) { [0]=> string(25) "<a href="test1">test1</a>" [1]=> string(25) "<a href="test2">test2</a>" [2]=> string(25) "<a href="test3">test3</a>" } [4]=> array(3) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" } [5]=> array(3) { [0]=> string(25) "<a href="test1">test1</a>" [1]=> string(25) "<a href="test2">test2</a>" [2]=> string(25) "<a href="test3">test3</a>" } }
< class="a"><td class=... で
< class="a"> にだけマッチさせたい場合には、
<tr.*>
を
<tr[^>]*>
か
<tr.*?>
というようにします。
<tr[^>]*> という方法もあるんですね。
上記ではうまくいきませんでしたが、
同じようなものを探していたところ、以下のような方法があり、
こちらの方法だとうまくいきました。
preg_match_all('@<tr[^>]*>(.*?)<\/tr>@is', $html, $lines); $result = array(); foreach ($lines[1] as $k => $line) { preg_match_all('@<td[^>]*>(.*?)<\/td>@is', $lines, $cell); foreach ($cell[1] as $cell) { $result[$k][] = trim($cell); } }
いろいろご教授頂きありがとうございました。
< class="a"><td class=... で
< class="a"> にだけマッチさせたい場合には、
を
か
というようにします。
2017/08/20 14:50:32<tr[^>]*> という方法もあるんですね。
上記ではうまくいきませんでしたが、
同じようなものを探していたところ、以下のような方法があり、
こちらの方法だとうまくいきました。
いろいろご教授頂きありがとうございました。
2017/08/20 22:00:07