スキップしてメイン コンテンツに移動

PHP正規表現での処理いろいろ


4バイト文字チェック

if ( preg_match( '/[\xF0-\xF7][\x80-\xBF][\x80-\xBF][\x80-\xBF]/', $value ) ) {
	return '4バイト文字が含まれています';
}

UTF-8で日本語は基本3バイトだけれど、旧漢字?とかあまり日常使わない漢字は4バイトのものがあるよう。

wikipediaによるとJIS X 0213という規格の文字とかこちらの文字とか。

4バイト文字は、
1バイト目 = \xf0-\xf7
2バイト目 = \x80-\xbf
3バイト目 = \x80-\xbf
4バイト目 = \x80-\xbf
の文字を指すので上記コードとなる。

参考:https://design215.com/toolbox/utf8-4byte-characters.php

画像ソースを取得

preg_match("/(.*)((http|https):\/\/.*?\.({$validSuffix}))(.*)/i", $elementValue, $aryMatch);
$img = $aryMatch[2]

HTML要素などの文字列の中から画像ソースを取得するときなどに使用した。
$validSuffixには許容する画像の拡張子を以下のようにパイプつなぎで設定する。

$validSuffix = 'png|jpeg|gif';

$elementValueは検索対象の文字列。
$aryMatchに検索結果が代入され、画像ソースは2番目のサブパターンなので$aryMatch[2]で取得できる。

変換指定\Q...\E

$searched_items = preg_grep( '/.*\Q' . $search . '\E.*/', $items );

上記のようなコードを見たときに\Q, \Eってなんだと思ったので調べると
\Q は \E までのメタ文字を無効化するのだそう。

他にも
\u は次の1文字を大文字に変換
\l は次の1文字を小文字に変換
\U は \E までの文字を大文字に変換
\L は \E までの文字を小文字に変換
などあるそう。
覚えられない...

こちらのサイトを参考にしました。
https://www.tohoho-web.com/ex/regexp.html#text_modifirers

URLの形式チェック

if ( ! preg_match( '/^(https?)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)$/', $url ) ) {
	$url_elements = preg_split('/^https?:\/\//', $url);
	if ( ! $url_elements || count( $url_elements ) <= 1 ) {
		echo( 'URL は http:// または https:// から入力してください' );
		return false;
	}

	$url_chars = preg_split("//u", $url_elements[1], -1, PREG_SPLIT_NO_EMPTY);
     // 上記はphp>=7.4ならmb_str_splitを使用できる
	$invalid_chars = preg_grep('/[^-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]/', $url_chars);
	if ( count( $invalid_chars ) ) {
		echo( 'URLとして不正な文字が含まれています: ' . current(  $invalid_chars ) );
		return false;
	}

	if ( ! filter_var( $url, FILTER_VALIDATE_URL ) ) {
		echo( 'URLの形式が不正です ' );
		return false;
	}
}

3行目でHTTP プロトコルのURLかをチェックし、
11行目ではURLとして不正な文字がないか、あればアラートを出す処置をし、
16行目ではPHPの検証フィルタ FILTER_VALIDATE_URL を使用してRFC2394に準拠しているかをチェックしている。

マルチバイト文字をURLエンコード

preg_replace_callback(
	'/[^\x21-\x7e]+/',
	function ( $matches ) {
		return urlencode( $matches[0] );
	},
$url );

URLに日本語などのマルチバイト文字が含まれる場合に、URLエンコードして返す処理。

逐次追記していこう。。

コメント