1. satorunooshie

    Posted

    satorunooshie
Changes in title
+PHPにおける文字列置き換え大全
Changes in tags
Changes in body
Source | HTML | Preview

目次

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

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

正規表現の基本的な構文

構文 説明
. 改行文字以外の任意の一文字
? 0回か1回だけのマッチ
* 0回以上の繰り返し
+ 1回以上の繰り返し
n
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);