正则表达式将<p> AND </p> <ul> / <ol>放入数组</ol> </ul>

时间:2009-09-21 10:39:53

标签: php regex preg-match-all

我正在PHP中搜索一个函数,将<p>, <ul> and <ol>之类的每个段落元素放入一个数组中。所以我可以操纵段落,比如显示前两段并隐藏其他段落。

这个函数为p元素提供了技巧。如何调整正则表达式以匹配ul和ol?我的试用给出了一个错误:抱怨&lt;不是运营商...

function aantalP($in){
    preg_match_all("|<p>(.*)</p>|U",
        $in,
        $out, PREG_PATTERN_ORDER);
    return $out;
}

//tryout:
    function aantalPT($in){
        preg_match_all("|(<p> | <ol>)(.*)(</p>|</o>)|U",
            $in,
            $out, PREG_PATTERN_ORDER);
        return $out;
    }

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:3)

使用正则表达式无法可靠地执行此操作。段落大多数都可以,因为它们通常不是嵌套的(尽管它们可以是嵌套的)。然而,列表通常是嵌套的,这是正则表达式落下的一个区域。

PHP有多种解析HTML和检索所选元素的方法。只需使用其中一个。它会更强大。

Parse HTML With PHP And DOM开始。

如果确实想要沿着正则表达式路线前进,请从:

开始
function aantalPT($in){
  preg_match_all('!<(p|ol)>(.*)</\1>!Us', $in, $out);
  return $out;
}

注意: PREG_PATTERN_ORDER不是必需的,因为它是默认值。

基本上,使用backreference查找匹配的标记。由于嵌套列表和嵌套在列表中的段落等多种原因,这将失败。不,这些问题无法用正则表达式解决(可靠)。

编辑:正如(正确地)指出的那样,正则表达式也有缺陷,因为它使用了管道分隔符并且你在正则表达式中使用了管道字符。我一般用!因为这通常不会出现在模式中(不管我的模式是什么)。有些使用正斜杠但它们也出现在这种模式中。 Tilde(〜)是另一个相当常见的选择。

答案 1 :(得分:2)

  • 首先,你使用|作为分隔符来标记正则表达式的开头和结尾。但你也使用|作为或标志。我建议你更换第一个和最后一个|用#。
  • 其次,您应该使用backreferences捕获起始和结束标记,例如:<(p|ul)>(.*?)</\1>