2009-08-14 100 views
2

我正在制作一个表单(html & php),它是用于编辑网站内容的管理部分的一部分。我想让用户包含一些基本的html。这工作正常。我想保留换行符。这也适用。我的问题是,当有人写这样的事情:删除html标签之间的换行符

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

代码行之间的换行符被保留,并在写出时变成BRs。这意味着每个LI元素之间有两倍的间距。现在这可以通过将整个列表部分写在一行上来解决,但是a)使读取变得困惑,并且b)教导人们使用代码很难,更不用说解释突出的换行符。

我想要的是某种方法可以剥除所有/ n,但仅在UL和/ UL标签之间。

+0

确定插入的内容时管理部分不具有HTML部分,这通常是做这样的东西正确的位置。 – 2009-08-14 10:27:08

+0

删除了PHP标记,因为这是一个关于HTML的问题,无论您使用的服务器端脚本是什么...... – RuudKok 2009-08-14 10:29:14

+0

@Zaagmans:但他希望在PHP中有一个实现。这可能与其他语言非常不同。 – 2009-08-14 10:35:07

回答

4

这个正则表达式中删除不在<li></li>

/(?<=<ul>|<\/li>)\s*?(?=<\/ul>|<li>)/is 

PHP示例之间的文本的一部分<ul></ul>之间的所有换行/空格:

$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> 

编辑:固定

+0

看起来很完美,但它出现错误: 警告:preg_replace()[function.preg-replace]:未知修饰符'l'in ... 我对正则表达式不太热...是否有错字那里? – 2009-08-14 10:49:44

+0

在php5中测试过。为我工作。 – 2009-08-14 10:56:29

+0

奇怪......我使用PHP 5.2.9。这是一个小写字母L,它会抛出错误。如果我把Ls拿出来,它会在<上抛出一个错误。 – 2009-08-14 10:59:01

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块之间有普通文本,则中间的文本也将被删除。

0

我很难理解为什么换行符变成<BR>。

这是怎么回事?它是PHP吗?

HTML不会将换行符视为空格吗?把它们变成<BR>似乎不正确。

+0

换行符作为/ n存储在数据库中,但当它们写在前端时,我使用nl2br将它们更改为
s。这在大多数情况下都是有意义的。使用列表时,这只是一个问题。 – 2009-08-14 11:02:20

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