我正在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;
}
任何人都可以帮助我吗?
答案 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)
<(p|ul)>(.*?)</\1>