你好我做了一个代码我需要一些帮助:)它一直没有给我任何东西,没有结果
这里的代码
<?php
$f=' <tr class="hover">
<td class="ra " >3.</td>
<td class="pla " ><a href="spieler.php?uid=3010">الـعـاصـفـة</a> </td>
<td class="al " ><a href="allianz.php?aid=127">|BRAVE|</a></td>
<td class="pop " >2519</td>
<td class="vil " >6</td>
</tr>
<tr class="hover">
<td class="ra " >3.</td>
<td class="pla " ><a href="spieler.php?uid=4292">LOOK</a> </td>
<td class="al " ><a href="allianz.php?aid=127">|BRAVE|</a></td>
<td class="pop " >2001</td>
<td class="vil " >5</td>
</tr>
<tr class="hover">
<td class="ra " >4.</td>
<td class="pla " ><a href="spieler.php?uid=2784">بو سعود</a> </td>
<td class="al " ><a href="allianz.php?aid=127">|BRAVE|</a></td>
<td class="pop " >1966</td>
<td class="vil " >5</td>
</tr>';
preg_match_all ("/<td class=\"pla \" ><a href=\"spieler.php?uid=(.*)\">(.*)<\/a> <\/td>/", $f, $result , PREG_SET_ORDER);
// putting data to array
foreach($result as $item){
$player=$item[2];
$text = "$player
";
print $text;
}
?>
有人可以告诉我有什么不对吗?并告诉我如何解决它? 非常感谢
答案 0 :(得分:1)
如果我没错,@ vch和@DirkPitt已经解决了部分问题。
另外,为了避免错误并使代码更具可读性,您应该遵循以下良好实践:
\Q
和\E
之间.
或?
)的文字子字符串。您可以将子字符串放在\Q
和\E
之间,而不是转义所有这些字符。$m['txt']
而不是$m[1]
之类的内容更具可读性。你不需要记住索引。示例:
$pattern = '~
\Q<td class="pla " >\E # these parts are seen as literal strings
\Q<a href="spieler.php?uid=\E # whitespaces outside \Q...\E are ignored
(?<id> [^"]* ) "> # named capture id
(?<txt> .*? )
\Q</a> </td>\E ~x';
if (preg_match_all($pattern, $str, $m, PREG_SET_ORDER)) {
foreach ($m as $v) {
echo "\nid: " . $v['id'] . "\ttxt: " . $v['txt'];
}
}
使用正则表达式解析html通常不是一个好主意,因为html语言具有非常灵活的语法,可以隐藏许多陷阱。例如,如果我在这里添加一个空格:<td class=" pla " >
模式将失败。但是在你的例子中并非如此,因为所有的表似乎都有相同的结构,空格和缩进。
如果没有正则表达式,这是一个更推荐的方法:
$xpath = new DOMXPath(DOMDocument::loadHTML('<?xml encoding="UTF-8">' . $str));
$linkNodes = $xpath->query('//tr[contains(@class, "hover")]'
. '/td[contains(@class, "pla")]/a');
foreach ($linkNodes as $node) {
echo "\nid: " . explode('=', $node->getAttribute('href'))[1]
. "\ttxt: " . $node->textContent;
}
您使用路径和属性来处理DOM树,而不是处理字符串,以获取目标节点(&#39; a&#39;标记)。一旦获得它们,您只需要在nodeList上循环并使用方法getAttribute()
和属性textContent
来获得您想要的内容。
答案 1 :(得分:0)
尝试使用延迟正则表达式:
替换它:
(.*)
有了这个:
(.*?)
也逃避特殊的迹象。 和?