如何将换行符更改为< br>仅在< p>之间和< / p>标签...?
$text = preg_replace( '#<P>(.*?)\r\n(.*?)</P>#s', '<P>$1<BR>$2</P>', $text );
这使得第一个新行字符为&lt; br&gt;。
答案 0 :(得分:1)
这里写着H̸̡̪̯ͨ͊̽̅̾̎Ȩ̬̩̾͛ͪ̈́̀́͘ ̶̧̨̱̹̭̯ͧ̾ͬC̷̙̲̝͖ͭ̏ͥͮ͟Oͮ͏̮̪̝͍M̲̖͊̒ͪͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌͝S̨̥̫͎̭ͯ̿̔̀ͅ ......
我将为您提供一个正则表达式(因为这是您要求的)但我建议您查看我上面链接的帖子。 正则表达式不是这项工作的最佳工具。
如果确实想要一个正则表达式解决方案,您可以使用以下内容:
(?:<p>|\G(?!\A))(?:(?!</p>).)*?\K\v(?=[\s\S]*?</p>)
假设您还希望捕获<p x>
x
代表一些任意数量的属性,您可以使用以下正则表达式:
(?:<p.*?>|\G(?!\A))(?:(?!</p>).)*?\K\v(?=[\s\S]*?</p>)
此正则表达式与<p.*?>
匹配,而不仅仅是<p>
。
<p>something
here</p>
<p>
Something else
here
</p>
<p>something <br/><br/>here</p>
<p><br/>Something else<br/>here<br/></p>
(?:<p>|\G(?!\A))
匹配以下任一项
<p>
按字面意思匹配<p>
\G(?!\A)
在上一个匹配结束时断言位置或第一个匹配的字符串开头,否定(使用否定前瞻)第一个匹配的字符串的开头(因此,此断言位置)在上一场比赛结束时)。(?:(?!</p>).)*?
匹配以下任意次数,但尽可能少
(?!</p>).
确定后续内容的否定前瞻不是<p>
字面意思。假设负向前瞻不匹配,则匹配任何字符(由于未使用s
修饰符,因此换行符除外)。\K
重置报告的匹配的起点。任何以前消费的字符都不再包含在最终匹配中。\v
匹配任何垂直空白字符(?=[\s\S]*?</p>)
确定以下内容的正向前瞻符合以下内容
[\s\S]*?
任意次数匹配任何字符,但尽可能少</p>
按字面意思匹配</p>
答案 1 :(得分:0)
解析器和正则表达式的示例:首先设置DOM
,查询p
标记,然后再次插入修改后的文本。< / p>
<?php
$html = <<<DATA
<div>
<p class="someclass">Some very import
information here
and here as well
</p>
</div>
DATA;
# set up the DOM
$dom = new DOMDocument();
$dom->loadHTML($html, LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED);
# set up the xpath
$xpath = new DOMXPath($dom);
# regex
$regex = '~\R\s*~';
foreach ($xpath->query("//p") as $line) {
$newnode = $dom->createDocumentFragment();
$newnode->appendXML(preg_replace($regex, "<br />", $line->textContent));
$line->nodeValue = '';
$line->appendChild($newnode);
}
echo $dom->saveHTML();
?>
<小时/> 这会产生
<div>
<p class="someclass">Some very import<br>information here<br>and here as well<br></p>
</div>
<小时/> 注意:这将失败......像:
<div>
<p class="someclass">Some very import
information here <img src="some-picture.png">
and here as well
</p>
</div>