PHPで利用できる正規表現で質問です。

 
"あ【いう】えおかき【こく】け【こ】"
 ↓
"あえおかきけ" (【】を消去)

という文字列の変換と、【】の中身を抽出して配列に書き出したいんですがどう書けば良いでしょうか?
よろしく御願いします。

回答の条件
  • 1人2回まで
  • 登録:2008/01/31 12:24:53
  • 終了:2008/02/07 12:25:02

回答(3件)

id:tezcello No.1

tezcello回答回数460ベストアンサー獲得回数692008/01/31 12:55:12

ポイント35pt

こんな感じでしょうか?

$str = 'あ【いう】えおかき【こく】け【こ】';

$res = preg_replace('/【.+?】/', '', $str);
var_dump($res);

文字コードは、PHPの内部コード等に合わせて下さい。(それらを含めて UTF-8 にしておくのが無難かも)

結果は、

string(18) "あえおかきけ"

こうなりました。

id:killingofthedead No.2

killingofthedead回答回数18ベストアンサー獲得回数42008/01/31 12:59:38

ポイント35pt

二回に分けないとダメですかね。

<?php
$str = "あ【いう】えおかき【こく】け【こ】";
$ptn = "/【(.+?)】/";

// 「あえおかきけ」が出力される
$str2 = preg_replace($ptn, "", $str);
print($str2 . "\n");

// $m[0]は無視
// $m[1][1] = "いう";
// $m[1][2] = "こく";
// $m[1][3] = "こ";
preg_match_all($ptn, $str, $m);
for ($i = 0; $i < count($m[1]); $i++) {
    print($m[1][$i] . "\n");
}
?>

preg_match_allについては以下をよく読むといいと思います。

http://jp.php.net/manual/ja/function.preg-match-all.php

id:openseed No.3

openseed回答回数51ベストアンサー獲得回数62008/01/31 23:56:39

ポイント10pt

より面倒ですが、別の方法(preg_replace_callback)。

※ 文字コードはUTF8に設定されていることを前提にします。

class HogeClass{
var $subject = "あ【いう】えおかき【こく】け【こ】";
var $pattern = "/【(.+?)】/";
var $replacement = "";

var $items = array();
function test1(){
return preg_replace_callback($this->pattern, array(&$this, "parseMatches"), $this->subject);
}
function parseMatches($matches){
$this->items[] = $matches[1];
return $this->replacement;
}
}
$hoge = new HogeClass();
print $hoge->test1();
echo "<hr"."/>";
print_r($hoge->items);
?>

  • id:KeyKey
    preg_replaceはUTF-8しかマルチバイトに対応していません。特にSJISはメタ文字と同じ文字コードを含んだ漢字があります。
    UTF-8を使うときは修飾子u(小文字)を使ってください。
  • id:tezcello
    曖昧な表現で申し訳ありませんでした。
    > それらを含めて UTF-8 にしておくのが無難かも
    それらを、UTF-8 に設定して利用すべきです
    に訂正します。

    mbstring.internal_encoding UTF-8 にして、スクリプトそのものも UTF-8 で記述する場合、特にu修飾子は不要と理解しておりましたが、間違っておりましたらご指摘頂けるとありがたいです。> KeyKey さん

  • id:KeyKey
    例を挙げます。
    ひらがなの正規表現で有名なもので[ぁ-ん]がありますが
    文字コードUTF-8で修飾子'u'を指定していない preg_match('/^[ぁ-ん]+$/', 'まみむめも') はマッチしません
    「ぁ」の文字コードは「\xE3\x81\x81」、「ん」は「\xE3\x82\x93」、「む」は「\xE3\x82\x80」となります
    'u'を指定していない場合1byte毎の比較になり「む」の3byte目の「\x80」が「ぁ」と「ん」の「\x81」「\x93」の間に入らないためです
    preg_match('/^[ぁ-ん]+$/u', 'まみむめも') この様に'u'を指定すると3byteで1文字と判断してくれるので
    「\xE3\x81\x81」と「\xE3\x82\x93」の間に「\xE3\x82\x80」が入りマッチします。
  • id:tezcello
    ありがとうございます。> KeyKey さん
    マルチバイト文字において、「全てのひらがな」のように、範囲指定をしようとすると問題があるという事ですね。
    つまり、マルチバイト文字を文字単位で何かをしようとする時に不都合が起きると。(例えば、.(ピリオド)をマルチバイト文字1文字に対応させたいとか、量指定子をマルチバイトコードの文字数として使いたい場合など)
    ただ、マルチバイト文字を扱う場合は「無条件に」u修飾子を添えなければならないという事では無さそうですが...

    マルチバイト文字を含む可能性があるときに文字単位で何かする場合(殆ど経験はありませんが)はmb系の関数を、文字列の走査などにはpreg系の関数を、と意識して使ってきましたので特に不具合無く使えてました(単なる「マグレ」?)が、少し理解が深まりましたので何かの時に使ってみようと思います。

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません