正则表达式匹配PHP </p>中<p>中的所有换行符

时间:2010-06-11 20:30:56

标签: php regex

我有以下样本数据集:

<p>first line\n
second line\n
third line\n</p>
first line\n
second line\n
third line\n

使用正则表达式,我如何匹配换行符,但仅限于它们在段落标记内。

此代码将在php中使用。

2 个答案:

答案 0 :(得分:2)

你可以将它分成两个正则表达式。首先拆分<p>代码(<p>.*?</p>),然后匹配结果中的换行符。

分而治之。一些小的正则表达式通常比大型正则表达式更快。<​​/ p>

我假设您完全控制了HTML,并且知道它已经很好了。因为在大多数情况下在html上使用正则表达式是禁止的。改为使用DOM解析器。

答案 1 :(得分:1)

好吧,正则表达式不适合解析HTML(使用DomDocument)。你还说你要“匹配”。这意味着捕获吗?更换? “检查”?假设检查,这是一个粗略的:

$regex = '#(?i:<p[^>]*>[^\\n]*)(\\n)(?i:[^<]*</p>)#';

它与<p><i>foo\n</i></p>不匹配,但它会匹配基本<p>标记内部有新行的情况(没有html子项)。

我建议的是抓住DomDocument,做这样的事情:

$dom = new DomDocument();
$dom->loadHTML($html);
$pTags = $dom->getElementsByTagName('p');
foreach ($pTags as $p) { 
    $txt = $p->textContent;
    if (strpos($txt, "\n") !== false) {
        //You found a \n within a P tag
    }
}