使用preg_match_all的php代码中出现错误
你好,我做了一个代码,我需要一些帮助:)它保持给我什么,没有结果 好的,代码在这里使用preg_match_all的php代码中出现错误,php,preg-match-all,Php,Preg Match All,你好,我做了一个代码,我需要一些帮助:)它保持给我什么,没有结果 好的,代码在这里 <?php $f=' <tr class="hover"> <td class="ra " >3.</td> <td class="pla " ><a href="spieler.php?uid=3010">الـعـاصـفـة</a> </td>
<?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已经解决了你的部分问题
另外,为了避免错误并使代码更具可读性,您应该遵循以下良好实践:
- 当您有一个长模式时,使用自由间距/verbose/comment/extended/。。。模式可以使用x修改器将其打开。在这种模式下,将忽略所有空白,并允许使用内联注释(在#之后)。要编写文字空间,必须将其放在字符类中或介于
\Q
和\E
- 当您的模式充满双引号时,请使用单引号,反之亦然。如果您的模式同时包含这两种语法,请使用nowdoc语法
- 同样,斜杠不是强制使用的分隔符,您可以使用波浪号或其他字符(即使允许,也避免使用正则表达式特殊字符)
- 当您在模式中有可能包含正则表达式特殊字符的文字子字符串时(如
或?
)。您可以将子字符串放在\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'];
}
}
$pattern=~
\这些部分被视为文字字符串
\Q\E~x′;
if(预匹配全部($pattern,$str,$m,预设置顺序)){
foreach(百万美元为v美元){
echo“\nid:.$v['id']”\ttxt:.$v['txt'];
}
}
使用正则表达式解析html通常不是一个好主意,因为html语言具有非常灵活的语法,可以隐藏许多陷阱。例如,如果我在这里添加一个空格:
该模式将失败。但在您的示例中并非如此,因为所有表似乎都具有相同的结构、空格和缩进
下面是一种更推荐的方法,可以在不使用正则表达式的情况下执行此操作:
$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;
}
$xpath=newdomxpath(DOMDocument::loadHTML(''.$str));
$linkNodes=$xpath->query('//tr[contains(@class,“hover”)]'
./td[包含(@class,“pla”)]/a');
foreach($linkNodes作为$node){
echo“\nid:”.explode('=',$node->getAttribute('href'))[1]
.“\ttxt:.$node->textContent;
}
不是处理字符串,而是使用路径和属性来处理DOM树,以获取目标节点(“a”标记)。一旦你得到它们,你只需要在节点列表上循环,并使用方法getAttribute()
和属性textContent
来获得你想要的。有一件事总是让我感到困惑,那就是在模式中不要转义?
和
。不应该使用正则表达式来解析HTML。。。