2010-03-21 126 views
4

哪個是「淨化」內容的最佳方式?一個例子...用PHP清理內容的最佳方法是什麼?

示例 - 之前的sanitize:

Morbi mollis ante vitae massa suscipit a tempus est pellentesque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla mattis iaculis consectetur. 
Morbi mollis ante vitae est pellentesque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla mattis iaculis consectetur. 

示例 - sanitize方法後:

<p>Morbi mollis ante vitae massa suscipit a tempus est pellentesque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla mattis iaculis consectetur.</p> 

<p>Morbi mollis ante vitae est pellentesque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla mattis iaculis consectetur.</p> 

它應該做的

  • 它應該添加p標籤而不是換行符。
  • 它應該刪除空白空間,如tripple空間
  • 它應該刪除雙重換行符。
  • 它應該刪除標籤。
  • 它應該刪除內容之前的換行符和空格(如果有)。
  • 它應該刪除內容後的換行符和空格(如果有)。

我知道我使用str_replace函數,它應該是一個更好的解決方案嗎?

我想要的功能看起來像這樣:

function sanitize($content) 
{ 
    // Do the magic! 
    return $content; 
} 
+0

這要看是什麼樣的「引擎」您要使用。用戶輸入HTML或某種BB/Wiki代碼或者作爲stackoverflow使用Markdown? – raspi 2010-03-21 14:16:07

+9

爲什麼你稱之爲「消毒」,而它看起來只是格式化?使用str_replace看起來像o.k.你可以發明一些奇特的正則表達式來做到這一點,但我懷疑它可能是可靠的。 trim()和幾個帶數組參數的str_replace()將完成所有工作。 – 2010-03-21 14:17:43

+0

內容未格式化,只是文本和不需要的字符。 這是格式化和消毒的組合。我想刪除不需要的東西(消毒),並想添加段落。謝謝你的評論! – 2010-03-21 14:24:10

回答

6
  • 它應該增加,而不是像斷線對標籤。

通過類似紡織翻譯或Markdown或任何其他humane markup language這些適合您需要的東西運行它。

  • 它應該消除像特里普爾空間
  • 它應該消除雙重換行符空的空間。
  • 它應該刪除標籤。
  • 它應該刪除內容之前的換行符和空格(如果有)。
  • 它應該刪除內容後的換行符和空格(如果有)。

爲什麼要麻煩?當HTML呈現爲文檔時,多個空格字符會被縮減爲一個空格,不是?你的大部分問題都可以解決。

3

看看SanitizeCakePHP

+2

多麼無用的課。 – 2010-03-21 14:27:13

6
function sanitize($content) { 
    // leading white space 
    $content = preg_replace('!^\s+!m', '', $content); 

    // trailing white space 
    $content = preg_replace('![ \t]+$!m', '', $content); 

    // tabs and multiple white space 
    $content = preg_replace('![ \t]+!', ' ', $content); 

    // multiple newlines 
    $content = preg_replace('![\r\n]+!', "\n", $content); 

    // paragraphs 
    $content = preg_replace('!(.+)!m', '<p>$1</p>', $content); 

    // done 
    return $content; 
} 

實施例:

$s = <<<END 
Morbi mollis ante vitae massa suscipit a tempus est pellentesque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla mattis iaculis consectetur. 
Morbi mollis ante vitae est pellentesque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla mattis iaculis consectetur. 
END; 

$out = sanitize($s); 

輸出:

<p>Morbi mollis ante vitae massa suscipit a tempus est pellentesque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla mattis iaculis consectetur.</p> 
<p>Morbi mollis ante vitae est pellentesque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla mattis iaculis consectetur.</p> 
+0

這些大多數需要'''修飾符指示他們應該匹配多個行嗎? – 2010-03-21 14:22:36

+0

@Richard's'('DOTALL')修飾符隻影響'.'匹配的內容(不管它是否與換行符匹配)。唯一使用'.'的表達式是最後一個,我利用它不匹配換行符,所以不用,'s'修飾符在任何地方都不需要。 – cletus 2010-03-21 14:43:34

+0

這會如何處理以下? $ s =「」; echo sanitize($ s); – thomasrutter 2010-05-27 06:15:14

相關問題