[英]error in php code using preg_match_all
你好,我做了一个代码,我需要一些帮助:)它一直给我什么,没有结果
好的,这里的代码
<?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;
}
?>
有人可以告诉我怎么了吗? 并向大众展示如何解决它? 非常感谢
如果我没记错的话,@ 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'];
}
}
用regex解析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树,以获取目标节点(“ a”标记)。 一旦获得它们,您只需要在nodeList上循环并使用方法getAttribute()
和属性textContent
即可获得所需的内容。
尝试使用惰性正则表达式:
替换为:
(.*)
有了这个:
(.*?)
也要逃脱特殊标志。 和?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.