繁体   English   中英

使用preg_match_all的php代码中的错误

[英]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已经解决了部分问题。

顺便说一句,为了避免错误并提高代码的可读性,您应该遵循以下良好做法:

  • 当您使用长模式时,请使用自由行距/详细/注释/扩展/ ...模式。 您可以使用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'];
    }
}

用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM