PHP 置換・正規表現


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

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

下に例を書きます:

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


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


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

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

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

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2016/04/18 19:56:46
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.1

回答回数4972ベストアンサー獲得回数2154

ポイント300pt

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

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

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

id:webtomake

ありがとうございます。
大変助かりました。

2016/04/18 19:56:37
  • id:rouge_2008
    スペースをすべて削除してから、該当する箇所の前後にスペースを追加する方が簡単にできるのではないかと思います。
    もっといい方法があるかもしれませんが、一例としてコメント残します。。(※サンプル文と条件判定箇所のコードを一部訂正して再コメントしています。)


    $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

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません