改行やタブなどの空白やその他のゴミを削除する正規表現を作成しました。
preg_replace('/[\s\t\n\r]+/mu', ' ', $var);
ただし、私の文字列は html エンコードされているため、一部の文字が &#...; に置き換えられます。
エンコードされた文字も考慮するにはどうすればよいでしょうか?
グループにそのような量指定子を作成することは可能でしょうか。
preg_replace('/(\s|	| )+/mu', ' ', $var)
編集
はい、これは機能しているようです:
$str=' t 	 e 	 	 	 s	t	 ';
echo '|'.preg_replace('/(\s|	| )+/mu',' ',$str).'|';
^ 期待される結果を生成します。| t e s t |
最初にhtmlデコードを行い、次に正規表現を適用し、終了してから再度エンコードすることができます
このようなもの:
$result = htmlentities(preg_replace('/[\s\t\n\r]+/mu', ' ', html_entity_decode($var)));
単一の正規表現では不十分な場合があります。
これにより、制御文字ではないエンティティでエンコードされたascii値が実際の ascii 文字に置き換えられ、制御文字はスペースで置き換えられ、126 を超えるすべてのものはそのままになります。
<?php
$in = "& À";
$out = preg_replace_callback('/&#(\d{1,4});/u', function($match) {
$v = $match[1]+0;
if($v < 33) return ' ';
elseif($v > 126) return $match[0];
else return chr($v);
}, $in);
$out = preg_replace('/\s{2,}/mu', ' ', $out);
echo $out;
?>
注:技術的には 127 ( ESC
) もアスキーですが、例を短くするためにスキップしました。
コールバック (および正規表現) を展開するか、中間ステップで名前付きエンティティを削除することができます。ただし、これは
と同等では 
なく、どちら 
がスペース幅の非表示文字であり、ラップできないことに注意してください。他の名前付きエンティティにも同じことが言えます (通常は 、 などを保持します­
) &
。
html_entity_decode()
最初に、次にpreg_replace
を使用します。
preg_replace('/[\s\t\n\r]+/mu', ' ', html_entity_decode($var));