使用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。。。