4

サーバーに値を投稿するcontenteditable要素があります。onblur

であるため、contenteditableスペース エントリが繰り返されると、空白の代わりに追加さ れるため、結果の HTML は次のようになります。

Testing title   middle   entry    

from 要素で取得すると.text()、通常の間隔で表示されます (アンダーラインはスペースをマークします):

Testing_title___middle___entry____

この.text()値は、PHP バックエンドに投稿しています。そこで、保存手順を実行します。紐はトリミングが必要なので、基本trim($title)はカットしませんでした。

そして、私はそれを理解することができないようです。

これも試しました 「\u00ed」のようなUnicodeエスケープシーケンスを適切なUTF-8エンコード文字にデコードする方法? 、どちらも助けにはなりませんでした。

Chrome Network インスペクタは、このエンコードされたデータを送信することを示しています:

Testing+title+%C2%A0+middle+%C2%A0+entry+%C2%A0+%C2%A0

implode(', ', unpack('C*', $title))戻り値:

84, 101, 115, 116, 105, 110, 103, // Testing
32, // space
116, 105, 116, 108, 101, // title
32,
194, 160, //  
32,
109, 105, 100, 100, 108, 101, // middle
32,
194, 160,
32,
101, 110, 116, 114, 121, // entry
32,
194, 160,
32,
194, 160

$title最終的には単なる$_POST['title'].

この文字列からすべての空白を削除するにはどうすればよいですか?


最後に、解決策は次のとおりです。

$title = preg_replace('/\s/iu', ' ', $title)
4

1 に答える 1

1

 トリミングを開始する前に、すべてをスペースに置き換えてみませんか?

$text= str_replace(' ', ' ', $text)

または、Unicode の安全性を維持したい場合は、mb_eregi_replace http: //www.php.net/manual/en/function.mb-eregi-replace.php を使用できます。

編集 - 2番目のアプローチ:

この回答によると ( https://stackoverflow.com/a/13992998/486780 )

194 160 は、NO-BREAK SPACE コードポイント (HTML が呼び出すコードポイントと同じ) の UTF-8 エンコードです。

つまり、空間のように見えても、実際には空間ではありません。(たとえば、ワードラップしないことがわかります。) \s の正規表現の一致は一致しますが、スペースとの単純な比較は一致しません。

上記のように正規表現を使用して一致させてみてください。

于 2013-05-30T11:05:04.867 に答える