1

非常に長いHTMLテーブルから情報を解析しています。現在、私が使用しているコードは、DOMDocument、DOMElement(など)クラスを使用して解析します。テーブルから情報を正規表現することに対して現在のメソッドを実行するパフォーマンステストを実行したかったのですが、正しい式を取得できません。

テーブルのHTML行は次のようになります。

<tr><td>   JON SMITH     </td><td> 2000-09-29 </td></tr>

そして、私が試みてきた表現は次のようになります。

/(?:<td>([a-zA-Z\s]*?)<\/td><td>([0-9-\s]*?)<\/td>)/

上記の式の問題は、内側の列の内容だけでなく、行の内容全体を返すことです。理想的には、preg_match_all配列の結果は、名前、日付、名前、日付などになります。

これは合理的なことですか、それともDOM手法に固執する必要がありますか?それが合理的である場合、誰かが正規表現で手を貸すことができますか?

ありがとう!

編集:将来誰かがこれに遭遇した場合に備えて、RegExソリューションはDOMクラスを使用するよりもはるかに優れたパフォーマンスを発揮します。私の状況では、それは秒と分の違いです。

4

2 に答える 2

0

preg_match_all() を使用して、3 番目のパラメーターに入力する配列を渡し、4 番目のパラメーター PREG_SET_ORDER を渡します。

preg_match_all("/(?:<td>([a-zA-Z\s]*?)<\/td><td>([0-9-\s]*?)<\/td>)/", $html, $matches, PREG_SET_ORDER);

結果の配列は次のようになります。

$matches => array(
   [0] => array(
      [0] => '<td>   JON SMITH     </td><td> 2000-09-29 </td>',
      [1] => '   JON SMITH     ',
      [2] => ' 2000-09-29 '
   ),
   [1] => array(
      [0] => '<td>   JACK BOLD     </td><td> 2000-10-20 </td>',
      [1] => '   JACK BOLD     ',
      [2] => ' 2000-10-20 '
   ),
   ...
);

preg_match_all() のドキュメントを参照してください。

于 2012-08-02T13:57:00.747 に答える
0

私の解決策:

ステップ1。検索<table>...</table>:
/<table[^>]*+>([^<]*+(?:(?!<\/?+table)<[^<]*+)*+)<\/table>/i

ステップ2。<tr>...</tr>step1 グループ 1 からすべて検索:
/<tr[^>]*+>([^<]*+(?:(?!<\/?+tr)<[^<]*+)*+)<\/tr>/ix

step3. すべてからデータを抽出します<td>...</td>(step2 group1 から):
/<td[^>]*+>([^<]*+(?:(?!<\/?+td)<[^<]*+)*+)<\/td>/ix

これらの恐ろしいパターンは、Mastering Regular Expressions 3rd

サンプルコード:

    <?php
$foo = '<tr><td>   JON SMITH     </td><td> 2000-09-29 </td></tr>';
if(preg_match_all('/<td[^>]*+>([^<]*+(?:(?!<\/?+td)<[^<]*+)*+)<\/td>/ix', $foo, $matches) > 0){
    for($i = 0; $i < count($matches[0]); ++$i)
        printf("%s\n", $matches[0][$i]);

    for($i = 0; $i < count($matches[1]); ++$i)
        printf("%s\n", $matches[1][$i]);
}
?>

出力:

<td>   JON SMITH     </td>
<td> 2000-09-29 </td>
JON SMITH
2000-09-29
于 2012-08-02T13:51:56.973 に答える