限制段落的正则表达式

Regex for limit paragraphs

这个问题被问了很多次,但我发现的片段并不奏效。我对正则表达式的经验较少,所以我希望你能帮助我。

我想按限制获取段落。 我知道我可以通过 preg_match_all.

来限制我的结果

我有两个挣扎:

例如:

<p>Paragraph 1</p>
<p attribute="value">Paragraph 2</p>

当我限制一个时,我只想要第一段,但是限制2也应该return第2段,即使它包含属性。

我尝试了什么:

function GetParagraph($content, $limitParagraph = 1)
{
    preg_match_all('~(<p>(.+?)</p>){' . (int)$limitParagraph. '}~i', $sHTML, $aMatches);
    return $aMatches[0];
}

'~(<p(.*?)>(.+?)</p>){' . (int)$limitParagraph. '}~i' 的正则表达式也不能正常工作

您不需要也不应该为此类任务使用正则表达式。这称为 HTML 解析,应该使用正确的工具、解析器来完成。在 PHP DOMDocumentDOMXPath 中,您的选择是:

$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($html);
libxml_use_internal_errors(false);
$paragraphs = $dom->getElementsByTagName('p');
foreach ($paragraphs as $i => $p) {
    // Two paragraphs only
    if ($i >= 2) break;
    echo $dom->saveHTML($p);
}

为什么您的 RegEx 不起作用?

因为四个原因:

  1. 每个 </p>
  2. 后不包含换行符
  3. 保存html内容的变量是错误的。 ($sHTML 而不是 $content
  4. 仅从输入字符串的开头开始遍历没有锚定。
  5. <p> 不匹配 <p attribute="value"> 或除自身以外的其他东西。

同样,不推荐这样做,但要具体回答这个问题,下面的正则表达式应该可以解决这些问题:

'~^.*?(?:<p[^>]*>.+?</p>\s*){' . $limitParagraph . '}~i'