0

次のようなHTMLがあります。

<tr class="row-even">
    <td align="center">abcde</td>
    <td align="center"><a href="deluserconfirm.html?user=abcde"><img src="../images/delete_x.gif" alt="Delete User" border="none" /></a></td>
</tr>
<tr class="row-odd">
    <td align="center">efgh</td>
    <td align="center"><a href="deluserconfirm.html?user=efgh"><img src="../images/delete_x.gif" alt="Delete User" border="none" /></a></td>
</tr>
<tr class="row-even">
    <td align="center">ijkl</td>
    <td align="center"><a href="deluserconfirm.html?user=ijkl"><img src="../images/delete_x.gif" alt="Delete User" border="none" /></a></td>
</tr>

そして、値、、、およびを取得する必要がabcdeありefghますijkl

これは私が現在使用している正規表現です:

preg_match_all('/(<tr class="row-even">|<tr class="row-odd">)<td align="center">(.*)<\/td><\/tr>/xs', $html, $matches);

はい、私はそれらがあまり得意ではありません。私の正規表現の試みのほとんどと同様に、これは機能していません。誰か教えてもらえますか?

また、html / xmlパーサーについては知っていますが、それを実現するには、コードを大幅に再検討する必要があります。後でそれはです。今のところ、正規表現に固執する必要があります。

編集:明確にするために、または<td align="center"></td>後の最初のタグの間の値が必要です<tr class="row-even"><tr class="row-odd">

4

6 に答える 6

2
~<tr class="row-(even|odd)">\s*<td align="center">(.*?)</td>~m

m修飾子と の使用に注意してください\s*

また、 を介して最初のグループを非キャプチャにすることもできます?:。つまり(?:even|odd)、おそらくclass属性には興味がないので:)

于 2010-10-19T07:31:15.040 に答える
2

これを試して:

preg_match_all('/(?:<tr class="row-even">|<tr class="row-odd">).<td align="center">(.*?)<\/td>/s', $html, $matches);

行われた変更:

  • タグ間の改行を考慮していません
  • 正規表現のスペースを破棄するため、修飾子を x にする必要はありません。
  • .*?の代わりにを使用して、マッチングを非貪欲にし .*ます。

ワーキングリンク

于 2010-10-19T07:36:22.033 に答える
2

実際、コードベースに大きな変更を加える必要はありません。テキスト ノードのフェッチは、DOM と XPath で常に同じです。変更されるのは XPath だけなので、DOM コードを関数にラップして、preg_match_all. それはほんの小さな変化です。

include_once "dom.php";
$matches = dom_match_all('//tr/td[1]', $html);

dom.php には以下が含まれています。

// dom.php
function dom_match_all($query, $html, array $matches = array()) {
    $dom = new DOMDocument;
    libxml_use_internal_errors(TRUE);
    $dom->loadHTML($html);
    libxml_clear_errors();
    $xPath = new DOMXPath($dom);
    foreach( $xPath->query($query) as $node ) {
        $matches[] = $node->nodeValue;
    }
    return $matches;
}

そして戻ってきます

Array
(
    [0] => abcde
    [1] => efgh
    [2] => ijkl
)

ただし、正規表現が必要な場合は、正規表現を使用してください。アイデアを出しているだけです。

于 2010-10-19T07:46:37.477 に答える
0

これは、ニーズを満たすための簡単で汚い正規表現です。簡単にクリーンアップして最適化できますが、それは始まりです。

<tr[^>]+>[^\n]*\n               #Match the opening <tr> tag
  \s*<td[^>]+>([^<]+)[^\n]+\n   #Group the wanted data
  [^\n]+\n                      #Match next line
</tr>                           #Match closing tag

より堅牢な代替方法を次に示します。

deluserconfirm.html\?user=([^"]+)
于 2010-10-19T07:29:48.860 に答える
0

これが私が思いついたものです

<td align="center">([^<]+)</td>

説明します。ここでの課題の 1 つは、タグの間にあるものが、探しているテキストまたはタグのいずれかである可能性があることです。正規表現では、[^<]+は、< 文字以外の1 つ以上の文字に一致することを示しています。これは素晴らしいことです。これは、 が一致しないことを意味し、グループはタグが見つかるまでのみ一致するためです。

于 2010-10-19T07:34:39.660 に答える
0

免責事項: 正規表現を使用して HTML を解析することは危険です。

各 TR の最初の TD の innerhtml を取得するには、次の正規表現を使用します。

/<tr[^>]*>\s*<td[^>]>(.+?)<\/td>/si
于 2010-10-19T07:36:25.433 に答える