从html标记之间删除换行符

时间:2009-08-14 10:24:24

标签: php html

我正在制作一个表单(html& php),它是用于编辑网站内容的管理部分的一部分。我想允许用户包含一些基本的HTML。这很好用。我想保留换行符。这也有效。我的问题是当有人写这样的东西时:

<ul>
<li>item one</li>
<li>item two</li>
</ul>

代码行之间的换行符被保留并在写出时变成BR。这意味着每个LI元素之间存在双倍间距。现在可以通过将整个列表部分写在一行上来解决这个问题,但是a)这使得它难以阅读和b)很难教人们使用代码,更不用说解释多余的换行了。

我想要的是一些剥离所有/ n的方法,但仅限于UL和/ UL标签之间。

4 个答案:

答案 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);
}