0

我正在 PHP 中寻找一个函数来将每个段落元素都<p>, <ul> and <ol>放入一个数组中。这样我就可以操纵段落,例如显示前两段并隐藏其他段落。

这个函数可以解决 p 元素的问题。如何调整正则表达式以匹配 ul 和 ol?我的试用给出了一个错误:抱怨 < 不是运算符...

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;
    }

谁能帮我?

4

2 回答 2

3

你不能用正则表达式可靠地做到这一点。段落大多没问题,因为它们通常不嵌套(尽管它们可以嵌套)。然而,列表通常是嵌套的,这是正则表达式失败的一个领域。

PHP 有多种解析 HTML 和检索选定元素的方法。只需使用其中之一。它会更加健壮。

从使用 PHP 和 DOM 解析 HTML开始。

如果您真的想走正则表达式路线,请从以下开始:

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

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

基本上,使用反向引用来查找匹配的标签。由于许多原因,例如嵌套列表和嵌套在列表中的段落,这将失败。不,这些问题不能(可靠地)用正则表达式解决。

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

于 2009-09-21T10:43:19.720 回答
2
  • 首先,你使用 | 作为分隔符来标记正则表达式的开始和结束。但你也使用 | 作为 or 符号。我建议你替换第一个和最后一个 | 和 #。
  • 其次,您应该使用反向引用来捕获开始和结束标记,如下所示:<(p|ul)>(.*?)</\1>
于 2009-09-21T10:46:34.997 回答