我对 cakePHPs Sanitize::clean() 方法到底应该做什么有点困惑。目前,当我添加记录时,我正在这样做:
$this->request->data = Sanitize::clean($this->request->data, array('encode' => true, 'remove_html' => true));
但是,这仍然留下 & 和 在我的数据库中,当他们使用 & 并在文本区域中按 Enter 键时。我怎样才能阻止这个?我以为remove_html => true 会做到这一点?
我需要做 str_replace() 吗
还有一些记录 其中有数百个尾部反斜杠,这意味着会破坏它们显示的任何视图。
有人能指出我正确的方向吗?谢谢
根据 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'
我也尝试了一个基本的trim(),但根本不起作用。
工作解决方案(除了&)
这将删除任意数量的
\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()
希望对某人有帮助!
根据文档,
clean
方法不会做你想要的事情。
首先,对于
\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
所以这里的区别在于你将换行符(也许是制表符和回车符,我不知道)传递为 strings,real
\
+n
,所以,preg_replace
蛋糕确实如此对你没有用。我知道您找到了解决方案(我建议您在其中添加选项卡并返回匹配项),但我想澄清为什么蛋糕的功能不起作用,以防其他人遇到类似的问题。