PHP正则表达式更改特定标记之间的新行字符

时间:2017-11-13 14:13:45

标签: php regex

如何将换行符更改为< br>仅在< p>之间和< / p>标签...?

$text = preg_replace( '#<P>(.*?)\r\n(.*?)</P>#s', '<P>$1<BR>$2</P>', $text );

这使得第一个新行字符为&lt; br&gt;。

2 个答案:

答案 0 :(得分:1)

这里写着H̸̡̪̯ͨ͊̽̅̾̎Ȩ̬̩̾͛ͪ̈́̀́͘ ̶̧̨̱̹̭̯ͧ̾ͬC̷̙̲̝͖ͭ̏ͥͮ͟Oͮ͏̮̪̝͍M̲̖͊̒ͪͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌͝S̨̥̫͎̭ͯ̿̔̀ͅ ......

我将为您提供一个正则表达式(因为这是您要求的)但我建议您查看我上面链接的帖子。 正则表达式不是这项工作的最佳工具。

代码

版本1

如果确实想要一个正则表达式解决方案,您可以使用以下内容:

See regex in use here

(?:<p>|\G(?!\A))(?:(?!</p>).)*?\K\v(?=[\s\S]*?</p>)

第2版

假设您还希望捕获<p x> x代表一些任意数量的属性,您可以使用以下正则表达式:

See regex in use here

(?:<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>