私は正規表現が苦手です。これが私のシナリオです。
いくつかのテーブルを含む Web ページから情報を抽出しようとしていますが、一意の URL (「very/unique.key」としましょう) が含まれているのは一部のテーブルのみであるため、次のようになります。
<table ....>
(bunch of content)
</table>
<table ....>
(bunch of content)
</table>
<table ....>
(bunch of content + "very/unique.key" keyword)
</table>
<table ....>
(bunch of content)
</table>
<table ....>
(bunch of content + "very/unique.key" keyword)
</table>
したがって、「very/unique.key」キーワードを含むすべてのテーブルのコンテンツを抽出する必要があります。そして、これが私が試したパターンです:
$pattern = "#<table[^>]+>((?!\<table)(?=very\/unique\.key).*)<\/table>#i";
これは私に何も返しません....
$pattern = "#<table[^>]+>((?!<table).*)<\/table>#i";
これは、条件があっても、テーブル 1 の開始タグ<table...>
から最後のテーブルの終了タグまでのすべてを返します...</table>
(?!<table)
これについて私を助けてくれる人に感謝します、ありがとう。
--編集--
これは、DOMを使用してすべてのテーブルをループするために見つけた解決策です
--私の解決策--
$index;//indexes of all the table(s) that contains the keyword
$cd = 0;//counter
$DOM = new DOMDocument();
$DOM->loadHTMLFile("http://uni.corp/sub/sub/target.php?key=123");
$xpath = new DomXPath($DOM);
$tables = $DOM->getElementsByTagName("table");
for ($n = 0; $n < $tables->length; $n++) {
$rows = $tables->item($n)->getElementsByTagName("tr");
for ($i = 0; $i < $rows->length; $i++) {
$cols = $rows->item($i)->getElementsbyTagName("td");
for ($j = 0; $j < $cols->length; $j++) {
$td = $cols->item($j); // grab the td element
$img = $xpath->query('./img',$td)->item(0); // grab the first direct img child element
if(isset($img) ){
$image = $img->getAttribute('src'); // grab the source of the image
echo $image;
if($image == "very/unique.key"){
echo $cols->item($j)->nodeValue, "\t";
$index[$cd] = $n;
if($n > $cd){
$cd++;
}
echo $cd . " " . $n;//for troubleshooting
}
}
}
echo "<br/>";
}
}
//loop that echo out only the table(s) that I want which contains the keyword
$loop = sizeof($index);
for ($n = 0; $n < $loop; $n++) {
$temp = $index[$n];
$rows = $tables->item($temp)->getElementsbyTagName("tr");
for ($i = 0; $i < $rows->length; $i++) {
$cols = $rows->item($i)->getElementsbyTagName("td");
for ($j = 0; $j < $cols->length; $j++) {
echo $cols->item($j)->nodeValue, "\t";
//proccess the extracted table content here
}
//echo "<br/>";
}
}
しかし、個人的には、正規表現の部分にまだ興味があります。誰かがこの質問の正規表現パターンの解決策を見つけてくれればいいのにと思います。とにかく、これについて私を助けたり助言したりしてくれているすべての人に感謝します(特にAbsoluteƵERØに)。