我正在制作一个表单(html& php),它是用于编辑网站内容的管理部分的一部分。我想允许用户包含一些基本的HTML。这很好用。我想保留换行符。这也有效。我的问题是当有人写这样的东西时:
<ul>
<li>item one</li>
<li>item two</li>
</ul>
代码行之间的换行符被保留并在写出时变成BR。这意味着每个LI元素之间存在双倍间距。现在可以通过将整个列表部分写在一行上来解决这个问题,但是a)这使得它难以阅读和b)很难教人们使用代码,更不用说解释多余的换行了。
我想要的是一些剥离所有/ n的方法,但仅限于UL和/ UL标签之间。
答案 0 :(得分:4)
此正则表达式会删除<ul>
和</ul>
之间不属于<li>
和</li>
/(?<=<ul>|<\/li>)\s*?(?=<\/ul>|<li>)/is
php示例:
$output = preg_replace('/(?<=<ul>|<\/li>)\s*?(?=<\/ul>|<li>)/is', '', $input);
输入:
<ul>
<li>item one</li>
<li>item two</li>
</ul>
输出:
<ul><li>item one</li><li>item two</li></ul>
编辑:已修复
答案 1 :(得分:0)
您可能可以使用正则表达式,但如果HTML格式不正确,这将失败。这应匹配HTML标记中的所有内容,因为默认情况下正则表达式是贪婪的。
<?php
$str = "Hello
<ul>
<li>item one</li>
<li>item two</li>
</ul>";
$str = preg_replace_callback('~\<[^>]+\>.*\</[^>]+\>~ms','stripNewLines', $str);
function stripNewLines($match) {
return str_replace(array("\r", "\n"), '', $match[0]);
}
echo nl2br($str);
修改强>
实际上,这不起作用。如果有两个HTML块,其中包含普通文本,则中间的文本也将被删除。
答案 2 :(得分:0)
我无法理解为什么换行会变成&lt; BR&gt;。
这是做什么的?是PHP吗?
HTML不会将换行符视为空格吗?将它们变成&lt; BR&gt;似乎不对。
答案 3 :(得分:0)
这是替换html标记中的换行符的示例:
public function testLineBreaks()
{
$html = '<span class="text"
>some title</span>';
$pattern = "#</?\w+((\s+\w+(\s*=\s*(?:\".*?\"|'.*?'|[^'\">\s]+))?)+\s*|\s*)/?>#";
$html = preg_replace_callback(
$pattern,
function($match){
$txt = str_replace(array("\r", "\n"), ' ', $match[0]);
return preg_replace("/[[:blank:]]+/"," ",$txt);
},$html
);
$this->assertEquals('<span class="text" >some title</span>', $html);
}