HTMLテーブルからデータを抽出するphp正規表現
-
18-09-2019 - |
質問
テーブルからデータを取り出すための正規表現を作成しようとしています。
私が今持っているコードは次のとおりです:
<table>
<tr>
<td>quote1</td>
<td>have you trying it off and on again ?</td>
</tr>
<tr>
<td>quote65</td>
<td>You wouldn't steal a helmet of a policeman</td>
</tr>
</table>
これを次のように置き換えたいと思います。
quote1:何度も試してみましたか?
引用65:警察官のヘルメットを盗むことはないでしょう
私がすでに書いたコードは次のとおりです。
%<td>((?s).*?)</td>%
しかし今、私は立ち往生しています。
解決
ティムの正規表現は、おそらく動作しますが、あなたはそれがマークアップの小さな変化に対処する上で、より信頼性が高い可能性があるとして、代わりに正規表現のPHPのDOMの機能を使用して検討する必要があります。
を参照してください。 loadHTML方法の
他のヒント
本当に正規表現を使用したい場合(文字列が常にそのようにフォーマットされると本当に確信している場合は大丈夫かもしれません)、あなたの場合、次のようなものはどうでしょうか。
$str = <<<A
<table>
<tr>
<td>quote1</td>
<td>have you trying it off and on again ?</td>
</tr>
<tr>
<td>quote65</td>
<td>You wouldn't steal a helmet of a policeman</td>
</tr>
</table>
A;
$matches = array();
preg_match_all('#<tr>\s+?<td>(.*?)</td>\s+?<td>(.*?)</td>\s+?</tr>#', $str, $matches);
var_dump($matches);
正規表現について一言:
<tr>
- 任意の数のスペース
- それから
<td>
- 次に、何をキャプチャしたいのか
- それから
</td>
- そしてまた同じです
- そして最後に、
</tr>
そして私は以下を使用します:
?
非貪欲モードで一致する正規表現内preg_match_all
すべての一致を取得するには
その後、必要な結果が得られます $matches[1]
そして $matches[2]
(ない $matches[0]
) ;の出力は次のとおりです var_dump
私が使用した (短くするためにエントリ 0 を削除しました) :
array
0 =>
...
1 =>
array
0 => string 'quote1' (length=6)
1 => string 'quote65' (length=7)
2 =>
array
0 => string 'have you trying it off and on again ?' (length=37)
1 => string 'You wouldn't steal a helmet of a policeman' (length=42)
その後、文字列の連結などを使用して、この配列を操作するだけです。たとえば、次のようになります。
$num = count($matches[1]);
for ($i=0 ; $i<$num ; $i++) {
echo $matches[1][$i] . ':' . $matches[2][$i] . '<br />';
}
そして、次のようになります:
quote1:have you trying it off and on again ?
quote65:You wouldn't steal a helmet of a policeman
注記 :いくつかのセキュリティチェックを追加する必要があります (のように preg_match_all
true を返す必要があり、カウントは少なくとも 1 でなければなりません...)
補足として: 正規表現を使用して HTML を解析するのは一般的にあまり良い考えではありません ;本物のパーサーを使用できれば、より安全になるはずです...
いつものように、HTMLや他の非正規言語から抽出テキストはパーサで行われるべき - 正規表現は、ここでは問題を引き起こす可能性があります。あなたは、データの構造を特定している場合しかし、あなたが使用することができます。
%<td>((?s).*?)</td>\s*<td>((?s).*?)</td>%
テキストの2枚を見つけることができます。 \ 1 \ 2は、置換である。
。テキストは複数行にまたがることができない場合、あなたは(?s)
ビットを落とすより安全だろう...