1

CakePHPs Sanitize::clean() メソッドが正確に何をすべきかについて少し混乱しています。現在、レコードを追加しているとき、私はこれをやっています:

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

ただし、& を使用してテキストエリアで Enter キーを押すと、データベースに & と \n が残ります。どうすればこれを止めることができますか? remove_html => true でこれができると思いましたか?

str_replace() まで行う必要がありますか?

また、 \n を含む一部のレコードには、表示されているビューを分割することを意味する何百もの末尾のバックスラッシュがあります。

誰かが私を正しい方向に向けることができますか? ありがとう

看護師の回答に従って更新

クリーンアップ後に以下を追加しました。

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'
    )
)

ビューを壊したくないので、あなたを\n外したいと思います。

より多くの結果

Cake 関数を切り取り、そのコードを直接インラインで使用する場合でも、次のようになります。

$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()ビューでエコーアウトするときに使用するだけです

それが誰かを助けることを願っています!

4

1 に答える 1

2

docsによると、cleanメソッドはあなたが望むことをしません。

まず、\n文字については、別の Sanitize 関数を呼び出す必要があります。Sanitize::clean()オプションがありますが、それは文字carriageを削除するだけです。したがって、メソッドを\r呼び出した後 (またはその前) に、 stripWhitespacesを呼び出します。残念ながら、この関数は文字列しか受け取らないため、ループで呼び出す必要があります (または、サニタイズしたい文字列がわかっている場合は、それを使用してください)。clean

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

この関数は次の文字を削除します: \r\nおよび\t、および 2 つ以上のスペースを 1 つだけに置き換えます。

&場合、ドキュメントでは、remove_htmlhtml タグを削除htmlentities($string, ENT_QUOTES, $defaultCharset, true)し、文字列に対して a も実行すると述べています。したがって、それがうまくいかない場合は、クラスhtmlentitiesに含まれていない別の関数を使用する必要があります。Sanitize

この動作がヘルパー内にあると思われる場合は、サニタイズ ヘルパーを拡張して関数stripWhiteSpaces内に含めclean、関数を自分に合ったものに置き換えhtmlentitiesます。この場合だけの場合は、呼び出した後、コントローラーにこれらの関数を追加しますSanitize::clean


私の回答に対するジェイソンの更新に従って更新します

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

したがって、ここでの違いは、改行(おそらくタブとリターンも、私にはわかりません)をstring、 real \+として渡していることです。nそのため、preg_replaceケーキは役に立ちません。その解決策を見つけたのは知っていますが(タブを追加してそこにも一致を返すことをお勧めします)、他の誰かが同様の問題を抱えている場合に備えて、ケーキの機能が機能しなかった理由を明確にしたかったのです。

于 2013-06-26T16:32:46.457 に答える