文字列があって、1文字1文字の後ろに<br>タグを挿入して、たてに表示させたいと思います。
一応このようなサブルーチンを考えました。
sub insertChar{
local $string = $_[0];
local $char = $_[1];
local $new = '';
local @chars = ();
local $temp = '';
while($string =~ s/^.//){
###全角の1バイトめがtempに入っていたら。2バイトめと一緒に配列に入れる。
if ($temp) {$temp .= "$&"; push (@chars, $temp); $temp = '';next;}
###tempが空のばあい、半角文字じゃないかどうかをチェック。半角文字で無ければtemp変数に取っておく。
if ($& =~ /[^a-zA-Z0-9_?,.!@\\\/\~\*\&\^\%\$\#\-\+\s\(\)\[\]\"\'\{\}\<\>\:\;\`\|]/) {$temp = "$&"; next;}
###tempが空で、全角の1バイトめでもなかったら半角文字ということで、素直に配列に入れる。
push (@chars, "$&");
}
$new = join ("$char", @chars);return $new;
}
これを
$hoge = &insertChar("$hoge",'<br>');
見たいな感じで使っています。実際期待通りに動いてはいるんですが、なんかきっともっとスマートなやり方があると思うんです。
とくに、半角文字を判断させるところはとにかく思い付く限りの半角もじをリストアップさせているだけで、しかも、どれをエスケープすべきかわからないので全部エスケープさせてしまいました。
一応どういうロジックで処理しているか説明しますと、受け取った文字列を1バイトづつ判断し、それが半角英数記号文字だったら@chars配列へ格納し、半角英数記号文字以外は2バイト文字の1バイトと目判断して$tempに格納、次の2バイトめと一緒にして、@charに格納。最後にjoinです。
なんか、もっと優雅な方法ってないものでしょうか?
よろしくお願いします。
No.1
- 回答日時:
こんばんわ。
Perlはやったことないので、処理の部分は良く分からないんですが、
全角文字かどうかの判断は、C言語の場合は
「そのバイトのコードが0x80以上だったら全角」
と判定していたかと思います。
(0x80以上だったら次のバイトと合わせて全角文字になるということ)
で、今家にあったCGI&Perlと言う名の本を引っ張り出して
眺めてみたところ、Perlでは「ord」と言うのを使えば良さそうです。
これで判定対象の文字列を16進数のコードに変換して、
これが0x80以上であれば全角文字の1バイト目である・・・と。
これ以上は良く分かりません。すんません(笑
早速ありがとうございます。
Perlのパターンマッチに捕われ過ぎていたせいか、文字コードのXXXX以上はなんちゃらという発想がぜんぜん浮かんできませんでした。
いまEUCでやってるんですけど、それだと0x80ではなく他のコードになるんでしょうね。
No.2ベストアンサー
- 回答日時:
こんにちは。
まず、文字の正規表現に関しては大崎さんのPerlメモがとても参考になります。
http://www.din.or.jp/~ohzaki/perl.htm
で、私ならこう書くというのを一つ。
sub insertChar {
my ($str, $char) = @_;
my $h_sjis = '(?:[\x00-\x7F\xA1-\xDF])';
my $z_sjis = '(?:[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])';
my @str = $str =~ /($h_sjis|$z_sjis)/og;
return join($char, @str);
}
上記はShift_JIS用に書いたコードですが、正規表現部分を変えることで、他の文字コードでも使えると思います。
これはすごいです!!!
早速sjisでやってみました。
いただいたURLでEUCも分かると思います。
配列へ入れる方法もこんな方法があるなんて知りませんでした。
どうも有り難うございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessで日付や数値を全角で表...
-
住宅にカナを入力する際に丁目...
-
word差し込み印刷 半角カタカ...
-
コマンドプロンプト 全角を含ん...
-
VBA 文字に半角が含まれて...
-
英数字のみ全角から半角に変換
-
IEからEdgeへの移行に伴うIMEの...
-
エクセルでの”々”の扱い
-
封筒の宛先で縦書きの書き方
-
コンボボックスに貼り付け文字...
-
正規表現で、全角文字を半角文...
-
エクセルにMicrosoft Barcode C...
-
VBでのカナの自動入力方法について
-
VBAの文字列の中に”(全角のダブ...
-
VBで、String型のデータが、...
-
全角スペースを削除するには?
-
perl 初めてのプログラムにエラ...
-
COBOLで全角変換を行いた...
-
VB.net、テキストボックス入力...
-
全角ひらがな、漢字をマッチさ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
英数字のみ全角から半角に変換
-
住宅にカナを入力する際に丁目...
-
全角英数字って全角の英字と全...
-
IEからEdgeへの移行に伴うIMEの...
-
全角英数字の必要性が理解できない
-
VBA 文字に半角が含まれて...
-
COBOL・全角判定
-
エクセルにMicrosoft Barcode C...
-
メモ帳の段落の揃え方
-
VBで、String型のデータが、...
-
プログラミングでは、半角括弧...
-
word差し込み印刷 半角カタカ...
-
ダブルコーテーションの置換
-
VB.net、テキストボックス入力...
-
封筒の宛先で縦書きの書き方
-
.NET3.5におけるキーボードの「...
-
コマンドプロンプト 全角を含ん...
-
char型全角数字から、int型半角...
-
いまスマホからカードの申込み...
-
C言語のコンパイルエラーなん...
おすすめ情報