使用preg_match_all在php代码中出错

时间:2014-08-17 21:43:43

标签: 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>
            <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;
}



?>

有人可以告诉我有什么不对吗?并告诉我如何解决它? 非常感谢

2 个答案:

答案 0 :(得分:1)

如果我没错,@ vch和@DirkPitt已经解决了部分问题。

另外,为了避免错误并使代码更具可读性,您应该遵循以下良好实践:

  • 当你有一个长模式时,使用free-spacing / 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'];
    }
}

使用正则表达式解析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)

尝试使用延迟正则表达式:

替换它:

(.*)

有了这个:

(.*?)

也逃避特殊的迹象。 和?