CakePHP - Sanitize ::干净的离开&和\ n

时间:2013-06-26 15:42:59

标签: cakephp sanitization

我对CakePHP Sanitize :: clean()方法究竟应该做些什么感到困惑。目前,当我添加一条记录时,我正在这样做:

$this->request->data = Sanitize::clean($this->request->data, array('encode' => true, 'remove_html' => true));

然而,这仍然留下&和\ n在我的数据库中,当他们使用&然后在textarea中输入。我怎么能阻止这个?我以为remove_html =>真的会这样做吗?

我是否需要去做str_replace()

其中一些带有\ n的记录有数百个尾随反斜杠,意味着打破它们显示的任何视图。

有人能指出我正确的方向吗?感谢

根据Nunsers回答

我现在在干净之后添加了以下内容:

foreach ($this->request->data['Expense'] as &$expense) {
    $expense['detail'] = Sanitize::stripWhitespace($expense['detail']);         
}
unset($expense);

但是,它确实删除了空格,但仍然留下了很多\n\n\n\n\n\

下面是$ this-> request-> data:

的调试
array(
    'submit' => 'Save',
    'Expense' => array(
        (int) 0 => array(
            'date' => array(
                'day' => '27',
                'month' => '06',
                'year' => '2013'
            ),
            'sitename' => 'test',
            'detail' => 'test test\n\ntest\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n',
            'ExpenseCode' => array(
                'ExpenseCode' => '1'
            ),
            'billable' => '1',
            'amount' => '1',
            'miles' => '',
            'total' => '1',
            'billable_mileage' => '',
            'recorded_global_mileage_rate' => '0.4'
        ),
        (int) 1 => array(
            'date' => array(
                'day' => '27',
                'month' => '06',
                'year' => '2013'
            ),
            'sitename' => 'test',
            'detail' => '\n\n\n\n\n\n\n\n\n\n\n\n\n\ntest',
            'ExpenseCode' => array(
                'ExpenseCode' => '4'
            ),
            'billable' => '1',
            'amount' => '10',
            'miles' => '',
            'total' => '10',
            'billable_mileage' => '',
            'recorded_global_mileage_rate' => '0.4'
        )
    ),
    'CashFloat' => array(
        'amount' => ''
    ),
    'ExpenseClaim' => array(
        'user_id' => '3',
        'claim_status_id' => '1'
    )
)

我想把我的事情剥离出去,因为我不希望他们打破观点。

更多结果

即使我剪切了蛋糕功能并直接通过以下方式使用其代码:

$expense['detail'] = preg_replace('/\s{2,}/u', ' ', preg_replace('/[\n\r\t]+/', '', $expense['detail']));

我仍然从循环中得到相同的(debug($ expense ['detail']):

'test 10 spaces before this then pressing enter lots \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n'

我也尝试了一个基本的修剪()根本没用。

工作解决方案(除了&)

这将删除任意数量的

\n

来自字符串

foreach ($this->request->data['Expense'] as &$expense) {

    $expense['detail'] = str_replace("\\n", ' ', $expense['detail']);
    $expense['detail'] = Sanitize::stripWhitespace($expense['detail']);             
}
// Unset referance var from above loop
unset($expense);

决定保留&

只需在视图中回显它时使用html_entity_decode()

希望能帮助别人!

1 个答案:

答案 0 :(得分:2)

根据the docsclean方法无法满足您的需求。

首先,对于\n个字符,您应该调用另一个Sanitize函数。 Sanitize::clean()有一个carriage选项,但只会删除\r个字符。因此,在调用clean方法之后(或之前),请致电stripWhitespaces。不幸的是,这个函数只接收一个字符串,所以你需要在一个循环中调用它(或者如果你知道要清理的字符串,那就用它吧。)

$cleanOfSpacesString = Sanitize::stripWhitespace($dirtyString);

该函数会删除此字符:\r\n\t,并仅用一个替换2个或多个空格。

对于&,文档说remove_html删除了html标记,并对字符串执行了htmlentities($string, ENT_QUOTES, $defaultCharset, true)。因此,如果htmlentities不适合您,则必须使用Sanitize类中未包含的其他函数。

如果您认为此行为是您希望在帮助程序中使用的行为,请扩展Sanitize帮助程序以在stripWhiteSpaces函数中包含clean,并用某些内容替换htmlentities函数这对你有用。如果只是针对这种情况,请在调用Sanitize::clean

后在控制器中添加这些功能

根据Jason对我的回答的更新进行更新

我发现stripWhitespaces函数无法正常工作,这很奇怪。以下解释为什么我认为它没有。

您想要从像这样的字符串中删除\n

'test test\n\ntest\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n'

和stripWhitespaces中的preg_replace就是这个

preg_replace('/[\n\r\t]+/', '', $str)

正则表达式删除新行,返回和标签在这样的字符串上

'test test

test

' //and a lot more newlines

所以这里的区别在于你传递换行符(也许是标签并返回,我也不知道)作为字符串,真实\ + {{1} },所以,n蛋糕对你没用。我知道你找到了一个解决方案(我建议你添加标签并在那里返回匹配),但我想澄清为什么蛋糕的功能不起作用以防其他人有类似的问题