2009-08-14 74 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); 
}