質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

687閲覧

半角濁点を除外した文字数算出

JanTh1989

総合スコア87

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2020/08/18 03:52

編集2020/08/18 04:30

入力値から半角濁点を除外した文字の文字数を算出し、うまくいかないです。
こちら、何がいけないのでしょうか・・・。

php

1function checkStrLengthLimit($str, $limit) 2{ 3 if( mb_strlen(mb_ereg_replace("゙|゚","",$str), "UTF-8") > $limit ){ 4 return "文字数超過"; 5 } 6 return "問題無し"; 7}

#今の動作となって欲しい動作
上限数($limit):10

パターンA
文字列($str):ガガガガガガガガガガ
今の動作:文字数超過
なって欲しい動作:問題無し

パターンB
文字列($str):ガガガガガガガガガガガ
今の動作:文字数超過
なって欲しい動作:文字数超過

#追加試験結果
上限数($limit):10

文字列($str):ガガガガガ
結果:問題無し

文字列($str):ガガガガガガ
結果:文字数超過

文字列($str):カカカカカカカカカガ
結果:問題無し

文字列($str):カカカカカカカカガガ
結果:文字数超過

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/08/18 03:54

どういうふうにうまくいかないんでしょうか
JanTh1989

2020/08/18 03:56

追記しました。
yoorwm

2020/08/18 04:05

http://charset.7jp.net/sjis.html こちらの半角文字の表でガを表示してみようとすると2文字必要になってしまいますが、そういった関係かもしれませんね。 CHARSETと内部文字コードを調べてみるとどうでしょう?
JanTh1989

2020/08/18 04:24

すみません。 define作っており、コードコピペ時に変えるのが漏れていました。 "UTF-8"になります。変更しました。
JanTh1989

2020/08/18 04:29

試験を続け、結果を追記しました。 どうにも、半角濁点の置換が1文字しかされていないようです。
guest

回答1

0

ベストアンサー

mb_strlen ( string $str [, string $encoding = mb_internal_encoding() ] )

mb_strlen についてはこんな感じなのですが、CHARSETでエラーを吐きませんか?
省略可能なので省略するとこちらの環境では動作しているように思います。

php

1function checkStrLengthLimit($str, $limit){ 2 if( mb_strlen(mb_ereg_replace("゙|゚","",$str)) > $limit ){ 3 return "文字数超過"; 4 } 5 return "問題無し"; 6}

20200819追記

以下のように、置換した結果を一度出力してみましたが問題ないように思います。

php

1<?php 2 3$str = "アババパパパバ"; 4 5echo checkStrLengthLimit($str,7); 6echo "\n"; 7 8function checkStrLengthLimit($str, $limit){ 9 $str_rpl = mb_ereg_replace("゙|゚","",$str); 10 11 echo "\n" . $str_rpl . "\n"; 12 13 if( mb_strlen($str_rpl, "UTF-8") > $limit ){ 14 return "文字数超過\n"; 15 } 16 return "問題無し\n"; 17} 18 19?> 20

イメージ説明

このファイルそのものはUTF-8で作成されている為、

$str = "アババパパパバ":

で $str に代入されている「アババパパパバ」の文字コードはUTF-8です。
この状態で実行すると質問者さんの意図通りに動作しているように見えます。

同じコードを書いても正常に動作しない場合、
$str に代入されている文字の文字コードがUTF-8ではないという可能性があると思います。

PHPの内部文字コードがUTF-8ではないのか、
そのPHPファイルに飛んでくるデータがUTF-8ではないのか…。

ひとまず、$strを

php

1$str = mb_convert_encoding($str, "UTF-8"); //内部文字エンコーディングからUTF-8に変更

このように変換してみてどうかチェックしてみてください。
コード自体は正常に動作するはずです…。

投稿2020/08/18 04:06

編集2020/08/19 00:43
phiar_poet

総合スコア230

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JanTh1989

2020/08/18 04:25

定数作って使っていたのを、そのままコードコピペしていました。 "UTF-8"になります。
phiar_poet

2020/08/18 04:29

それであれば、このコードの CHARSET 部分をそのまま "UTF-8" と書き換えても動作しましたね…。 なにかエラー等を出力するのでしょうか?? エラーは出力しないけどこの通りに結果が出ないとか、そういう話でしょうか? $str の中身がUTF-8でエンコードされていない…というパターンはありませんか?
JanTh1989

2020/08/18 04:33 編集

内容に追記もしましたが、置換が1文字しかされていないようです。 str_replaceで行うとかが良いのだろうか、と。
JanTh1989

2020/08/18 04:41

>エラーは出力しないけどこの通りに結果が出ないとか、そういう話でしょうか? →そうなります。濁点1文字だけなら、結果は思った通りになってくれます。 >$str の中身がUTF-8でエンコードされていない…というパターンはありませんか? こちら、どう調べれば良いのかがなんとも・・・。
phiar_poet

2020/08/19 00:43

回答を追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問