質問

テーブルからデータを取り出すための正規表現を作成しようとしています。

私が今持っているコードは次のとおりです:

<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)ビットを落とすより安全だろう...

HTMLパーサを使用し、正規表現を使用しないでください。このようなhref="http://simplehtmldom.sourceforge.net/" rel="nofollow noreferrer"> PHPシンプルなHTML DOMパーサの

<td>から各コンテンツを抽出

    preg_match_all("%\<td((?s).*?)</td>%", $respose, $mathes);
    var_dump($mathes);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top