人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHP 置換・正規表現

文中のスペース削除方法を探しています。

単にスペースを削除するのではなく、スペースの前後が日本語である場合のみスペースを削除する場合にはどうすればよいでしょうか?

下に例を書きます:

「明日 日比谷公園 に 向かい ます ので、何卒 よろしくお願いいたします。」
↓↓↓↓
「明日日比谷公園に向かいますので、何卒よろしくお願いいたします。」


ただし、スペース前後の文字が日本語以外であればそのままにする。


「これは MR32 という製品で 93年に対応した製品です 【未使用品】」
↓↓↓↓
「これは MR32 という製品で 93年に対応した製品です 【未使用品】」
⇒変更無し

スペースの前後は記号もNGで、すべて日本語である事が条件です。

よろしくお願いいたします。

●質問者: webtomake
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● a-kuma3
●300ポイント ベストアンサー

「日本語」というのをどう考えるか、というのがあるのですが、肯定的先読みと肯定的後読みを使うと それっぽいことができます。

こちらは、「日本語」=「英数字ではない」とした場合のコード。

<?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


webtomakeさんのコメント
ありがとうございます。 大変助かりました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ