限制段落的正则表达式
Regex for limit paragraphs
这个问题被问了很多次,但我发现的片段并不奏效。我对正则表达式的经验较少,所以我希望你能帮助我。
我想按限制获取段落。
我知道我可以通过 preg_match_all.
来限制我的结果
我有两个挣扎:
- 段落由 html 编辑"created",因此有时会附加属性
- 如果可以的话,我也想要
<p>
,但是只得到文字也不错
例如:
<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 DOMDocument
和 DOMXPath
中,您的选择是:
$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 不起作用?
因为四个原因:
- 每个
</p>
后不包含换行符
- 保存html内容的变量是错误的。 (
$sHTML
而不是 $content
)
- 仅从输入字符串的开头开始遍历没有锚定。
<p>
不匹配 <p attribute="value">
或除自身以外的其他东西。
同样,不推荐这样做,但要具体回答这个问题,下面的正则表达式应该可以解决这些问题:
'~^.*?(?:<p[^>]*>.+?</p>\s*){' . $limitParagraph . '}~i'
这个问题被问了很多次,但我发现的片段并不奏效。我对正则表达式的经验较少,所以我希望你能帮助我。
我想按限制获取段落。 我知道我可以通过 preg_match_all.
来限制我的结果我有两个挣扎:
- 段落由 html 编辑"created",因此有时会附加属性
- 如果可以的话,我也想要
<p>
,但是只得到文字也不错
例如:
<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 DOMDocument
和 DOMXPath
中,您的选择是:
$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 不起作用?
因为四个原因:
- 每个
</p>
后不包含换行符
- 保存html内容的变量是错误的。 (
$sHTML
而不是$content
) - 仅从输入字符串的开头开始遍历没有锚定。
<p>
不匹配<p attribute="value">
或除自身以外的其他东西。
同样,不推荐这样做,但要具体回答这个问题,下面的正则表达式应该可以解决这些问题:
'~^.*?(?:<p[^>]*>.+?</p>\s*){' . $limitParagraph . '}~i'