LoginSignup
3
5

More than 3 years have passed since last update.

PHPにおける文字列置き換え大全

Last updated at Posted at 2020-09-22

コピペして使うように作りましたー
間違ってたら教えてください!!

目次

よく使う正規表現のパターンマッチ
携帯番号の例
郵便番号の例
全角カタカナの例
なんちゃってメールアドレスの例
クレジットカード全社の例
IPアドレスの例
文字列を繰り返す方法
入力値を統一する方法
小文字から大文字に変換
大文字から小文字に変換
全角を半角に変換
半角を全角に変換
カナ文字の変換
文字エンコードの変換
文字列の一部を切り抜く方法
文字列の一部が一致しているか確認する
文字列の置き換え

よく使う正規表現のパターンマッチ

正規表現の基本的な構文

構文 説明
. 改行文字以外の任意の一文字
? 0回か1回だけのマッチ
* 0回以上の繰り返し
+ 1回以上の繰り返し
{n} n回の繰り返し
{n,m} n回以上m回以上の繰り返し
^ 文字列及び行の始まり
$ 文字列及び行の終わり
[] 文字クラス[a-z]ならaからzまでの一文字
\A 文字列の始まり
\z 文字列の終わり
\w 単語構成文字[a-zA-Z0-9_]とは異なる可能性がある
\d 数字
\s スペースタブ改行などの空白文字
\S 空白以外の全ての文字
() パターンのグループ化

パターン修飾子はデリミタ(\)の後に書く

パターン修飾子 説明
i 大文字と小文字を区別しない
m 行単位でマッチ
s 「.」を改行文字にもマッチさせる
u パターン文字列をUTF-8エンコードとして扱う
x エスケープするか文字クラスの内部を除いてパターン中の空白文字を無視

\をマッチさせるには
\\\\とする必要がある
正規表現でもPHPでもエスケープするため

携帯番号の例

example.php
//080-1234-5678, 09012345678
$tel_pattern = '/\A(090|080|070)-?\d{4}-?\d{4}\z/';

郵便番号の例

example.php
//111-1112, 1111112
$postal_code_pattern = '/\A\d{3}-?\d{4}\z';

全角カタカナの例

example.php
$em_kana_pattern = '/\A[\x{30A1}-\x{30FC}().-]+\x/u';

半角カタカナの例

example.php
$en_kana_pattern = '/\A[\x{FF66}-\x{FF9F}]+\x/u';

なんちゃってメールアドレスの例

example.php
$mail_pattern = '/\A[\p{L}0-9!#$%&\'*+\/=?^_`{|}~-]+(?:\.[\p{L}0-9!#$%&\'*+\/=?^_`{|}~-]+)*@(?:[_\p{L}0-9][-_\p{L}0-9]*\.)*(?:[\p{L}0-9][-\p{L}0-9]{0,62})\.(?:(?:[a-z]{2}\.)?[a-z]{2,})\z/ui';

クレジットカード全社の例

example.php
$cards_pattern = '/\A(4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|6(?:011|5[0-9]{2})[0-9]{12}|^(?:2131|1800|35\d{3})\d{11}$)\z/';
$visa_pattern = '/\A4\\d{12}(\\d{3})?\z/';
$master_pattern = '/\A5[1-5]\\d{14}\z/';
$jcb_pattern = '/\A(3\\d{4}|2100|1800)\\d{11}\z/';
$amex_pattern = '/\A3[4|7]\\d{13}\z/';
$diners_pattern = '/\A(?:3(0[0-5]|[68]\\d)\\d{11})|(?:5[1-5]\\d{14})\z/';
$discovery_pattern = '/\A(?:6011|650\\d)\\d{12}\z/';

IPアドレスの例

example.php
$ipv4_pattern = '\A(?:(?:25[0-5]|2[0-4][0-9]|(?:(?:1[0-9])?|[1-9]?)[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|(?:(?:1[0-9])?|[1-9]?)[0-9])\z';

$ipv6_pattern = '\A((([0-9A-Fa-f]{1,4}:){7}(([0-9A-Fa-f]{1,4})|:))|(([0-9A-Fa-f]{1,4}:){6}(:|((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})|(:[0-9A-Fa-f]{1,4})))|(([0-9A-Fa-f]{1,4}:){5}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){0,1}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){0,2}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){0,3}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:)(:[0-9A-Fa-f]{1,4}){0,4}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(:(:[0-9A-Fa-f]{1,4}){0,5}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})))(%.+)?\z';

参考
https://qiita.com/ryounagaoka/items/dc9fe731d0fa6f8f9daa

文字列を繰り返す方法

str_repeatを使う

example.php
str_repeat('*', 10);

入力値を統一する方法

小文字から大文字に変換

strtoupper()関数を使う
mb_strtoupper()関数を使えば全角のアルファベットも変換する
ucfirst()関数は最初の文字だけを大文字に変換し
ucwords()関数は最初の単語だけを大文字に変換します

大文字から小文字に変換

strtolower()関数を使う
mb_strtolower()関数を使えば、全角のアルファベットも変換する

全角を半角に変換

mb_conver_kana()関数を使う

オプション 説明
r 全角英字を半角に変換
n 全角数字を半角に変換
a 全角英数字を半角に変換
s 全角スペースを半角に変換
example.php
mb_convert_kana($text, 'r');

半角を全角に変換

同じくmb_convert_kana()関数の第二引数を使う

オプション 説明
R 半角英字を全角に変換
N 半角数字を全角に変換
A 半角英数字を全角に変換
S 半角スペースを全角に変換

カナ文字の変換

同じくmb_convert_kana()関数の第二引数を使う

オプション 説明
k 全角カタカナを半角カタカナに変換
K 半角カタカナを全角カタカナに変換
h 全角平仮名を半角平仮名に変換
H 半角カタカナを全角平仮名に変換
c 全角カタカナを全角平仮名に変換
C 全角平仮名を全角カタカナに変換
V 濁点付きの文字を一文字に変換、KやHと共に使う
s 全角スペースを半角に変換
S 半角スペースを全角に変換
example.php
mb_conver_kana($text, 'HV');

文字エンコードの変換

mb_convert_encoding()関数を使う

example.php
mb_convert_encoding(mb_convert_encoding($text, 'SJIS'), 'UTF-8', 'SJIS');
mb_convert_encoding(mb_convert_encoding($text, 'EUC-JP'), 'UTF-8', 'EUC-JP');

文字列の一部を切り抜く方法

mb_substr('文字列', '開始位置'[, '文字数'])を使う
文字数を省略した場合、開始位置から末尾までの文字列の全てを返す
また先頭は0から始まる
マイナスを指定することもできる

example.php
$text = 'asdfghjkl';
echo mb_substr($text, 0, 5); //asdfg
echo mb_substr($text, 2); //dfghjkl
echo mb_substr($text, -5); //lkjhg

文字列の一部が一致しているか確認する

mb_strpos()関数を使う
最初に見つかった位置を数値で返す

example.php
if (mb_strpos($target, $keyword) === false) echo $keyword . 'が見つかりませんでした';

演算子は'==='を使う必要があります
検索する文字が先頭に見つかってしまった場合に0を返すからです。

文字列の置き換え

str_replace()関数を使う

example.php
echo str_replace('before', 'after', $target);
3
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5