文中のスペース削除方法を探しています。
単にスペースを削除するのではなく、スペースの前後が日本語である場合のみスペースを削除する場合にはどうすればよいでしょうか?
下に例を書きます:
「明日 日比谷公園 に 向かい ます ので、何卒 よろしくお願いいたします。」
↓↓↓↓
「明日日比谷公園に向かいますので、何卒よろしくお願いいたします。」
ただし、スペース前後の文字が日本語以外であればそのままにする。
「これは MR32 という製品で 93年に対応した製品です 【未使用品】」
↓↓↓↓
「これは MR32 という製品で 93年に対応した製品です 【未使用品】」
⇒変更無し
スペースの前後は記号もNGで、すべて日本語である事が条件です。
よろしくお願いいたします。
「日本語」というのをどう考えるか、というのがあるのですが、肯定的先読みと肯定的後読みを使うと それっぽいことができます。
こちらは、「日本語」=「英数字ではない」とした場合のコード。
<?php function chink_space($s) { $s = preg_replace('/(?<=[^A-z0-9]) +(?=[^A-z0-9])/', '', $s); return $s; }
複数の空白が続いた場合も消すようにしてます。
PHP 5.1.0 以降で、対象のテキストが Unicode の場合には、Unicode 文字プロパティ というのが使えます。
http://php.net/manual/ja/regexp.reference.unicode.php
その Unicode 文字プロパティを使ってみると、こう書けます。
<?php function chink_space($s) { $s = preg_replace('/(?<=[\p{Han}\p{Hiragana}\p{Katakana}]) +(?=[\p{Han}\p{Hiragana}\p{Katakana}])/u', '', $s); return $s; }
パターン修飾子の u がポイント。
プログラム的には、同じものが二回出てくるので、こんな感じに書いた方が良いのかもしれません。
<?php function chink_space($s) { $k = '[^A-z0-9]' $s = preg_replace('/(?<=' . $k . ') +(?=' . $k . ')/', '', $s); return $s; }
正規表現が見づらくなるわけですが。
ideone.com で試したのがこちら。
http://ideone.com/Izxwep
もっといい方法があるかもしれませんが、一例としてコメント残します。。(※サンプル文と条件判定箇所のコードを一部訂正して再コメントしています。)
$text = "処理対象の 適当な サンプル文章です。 ●●●の動作対象 OS は、windows 7, 8, 8.1, 10です。";
$words = explode(" ", $text);
$new_text = '';
foreach($words as $word) {
if(preg_match('/[-A-z0-9,]+/', $word) || preg_match('/("|\'|【|『).*(\'|"|【|『)/', $word)) {
$new_text .= " " . $word . " ";
} else {
$new_text .= $word;
}
}
$new_text = preg_replace('/\s{2,}/', ' ', $new_text);
$new_text = trim($new_text);
・PHP: explode - Manual
http://php.net/manual/ja/function.explode.php
・PHP: preg_match - Manual
http://php.net/manual/ja/function.preg-match.php
・PHP: preg_replace - Manual
http://php.net/manual/ja/function.preg-replace.php
・PHP: trim - Manual
http://php.net/manual/ja/function.trim.php