質問するログイン新規登録
PHP

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

Q&A

解決済

4回答

571閲覧

phpで半角文字列に指定の長さまでスペース埋めしたい

yoheiiii

総合スコア91

PHP

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

0グッド

0クリップ

投稿2024/09/13 09:22

0

0

実現したいこと

半角で40文字いっていない場合は半角スペースで埋めたい。

該当のソースコード

sprintf("%-40s", 'テストテストテ');

実際に下記の様に追加は出来ているのですが、
合計26文字にしかなりません。
'テストテストテ '

試したこと

調べているのですが、どれも固定数を追加などで自分の求めているものに行きついていません。
https://qiita.com/tksnino/items/7188b95ea7f8e3a3b8dc

ご教授お願い致します。

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

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

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

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

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

guest

回答4

0

mb_strwidth() を利用するとよいかもしれません。

PHP: mb_strwidth - Manual

mb_strwidth(string $string, ?string $encoding = null): int

文字列 string の幅を返します。半角文字は 1 として、全角文字は 2 として数えます。 東アジアの文字の長さに関する詳細は http://www.unicode.org/reports/tr11/ を参照ください。

php

1<?php 2 3$str = 'テストテストテ'; 4$pad_width = 40 - mb_strwidth($str); 5$str .= str_repeat(' ', $pad_width > 0 ? $pad_width : 0); 6var_dump(mb_strwidth($str)); 7var_dump($str); 8 9// int(40) 10// string(54) "テストテストテ "

投稿2024/09/13 18:53

melian

総合スコア21343

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

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

otn

2024/09/14 01:27 編集

なるほど。こんな関数もあったのですね。知りませんでした。 Unicodeにしかない文字も扱えますが、普通にシフトJISにあって幅2とみて欲しい ★ や ● ◎ などが 幅1 となってしまいますので、結局は、「対象となる文字列に、どんな文字があり得るか」次第ですかね。 あとフォントか。★ などが半角幅になるフォントがあるのならそれを使えば、これらの文字を使っていても mb_strwidth で解決です。 ※ WindowsのWindowsTerminalで、"あ" と "★" の幅が違うので困ってまして、これらの文字がmb_strwidthでどうなんだろうと思って確認すると1でしたのでコメントしました。 もしかして、設定でこれら ambiguous widthの文字幅をなんと見るかの変更が出来るかと思いリファレンスを検索してみましたが、分からず。
guest

0

普通のPHPのコードはUTF-8で書くので、半角カナも、ほとんどの全角日本語文字も両方とも3バイトです。キーボードから直接打てる半角英数記号は1バイトです。
半角カナが1バイトで、全角日本語文字が2バイトなのは、Shift_JISくらいですので、普通の等幅フォントを使うイメージで、「半角英数字記号や半角カナは幅1、全角日本語文字は幅2」として幅40にしたいのであれば、一旦Shift_JISに変換すると分かり易いです。
ただし、「UTF-8にはあるが、Shift_JISには無い文字」がいろいろあるので、そういう文字があると化けます。例えば「⒜」とか「㐂」とか。

PHP

1$x='テストテストテ'; 2$y=mb_convert_encoding( 3 sprintf("%-40s", mb_convert_encoding($x,"SJIS-WIN","UTF-8")), 4 "UTF-8","SJIS-WIN"); 5echo "1234567890123456789012345678901234567890\n"; 6echo $y."!\n";

コードでは、Shift_JISより若干使える文字が多いSJIS-WIN(Windows-31J:WindowsのシフトJISの拡張版)にしてます。
Windows-31Jにない文字も扱いたいなら面倒でわかりにくいプログラムになると思います。

投稿2024/09/13 13:56

編集2024/09/13 16:16
otn

総合スコア86385

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

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

0

ベストアンサー

半角で40文字
全角の場合はどの様にするのでしょうか?
とりあえず、全角半角問わず(=英数も含む)40文字であるとします。
こんな感じでも実現できます。

PHP

1$limit = 40; 2$src = 'テストテストテ'; 3var_dump(mb_substr($src . str_repeat(' ', $limit), 0, $limit));

ですが...

どれも固定数を追加などで自分の求めているものに行きついていません。
参照先の最後に mb_str_pad() についての記述がありますが、これは期待に副うモノではありませんか?
__PHP8.3以上なら関数定義は不要(公式に取り込まれた)
__https://www.php.net/manual/ja/function.mb-str-pad.php

投稿2024/09/13 12:34

tezcello

総合スコア443

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

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

0

おそらく半角カタカナが1文字3バイト、7文字で合計21バイト。
不足の19文字を追加して26文字になっていると思います。

下記のようにすれば40文字になりますが、全角文字も1文字になるのでご注意ください。

PHP

1$n = 40; 2$s='テストテストテ'; 3$x = mb_strlen($s); 4if ($x < $n) { 5 $s .= str_repeat(' ', $n - $x); 6} 7echo $s;

投稿2024/09/13 12:12

tabuu

総合スコア2493

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問