2010-03-21 42 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

相关问题