Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
63.64% covered (warning)
63.64%
7 / 11
CRAP
70.91% covered (success)
70.91%
39 / 55
Strings
0.00% covered (danger)
0.00%
0 / 1
63.64% covered (warning)
63.64%
7 / 11
44.95
70.91% covered (success)
70.91%
39 / 55
 isPositiveInterger
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
3 / 3
 isGteZeroInteger
100.00% covered (success)
100.00%
1 / 1
4
100.00% covered (success)
100.00%
5 / 5
 isOuterBmpUnicode
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
4 / 4
 removeCrLf
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
7 / 7
 isUtf8
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
3 / 3
 convertEol
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 hasControlChars
100.00% covered (success)
100.00%
1 / 1
4
100.00% covered (success)
100.00%
16 / 16
 rand
0.00% covered (danger)
0.00%
0 / 1
12
0.00% covered (danger)
0.00%
0 / 3
 createRandomString
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
 createRandomStringMcrypt
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
 bin2String
0.00% covered (danger)
0.00%
0 / 1
20
0.00% covered (danger)
0.00%
0 / 9
<?php
namespace Puyo\Util;
/**
 * 文字列関連ユーティリティ
 * @version 1.2.1
 * @uses openssl
 */
class Strings
{
    /**
     * 正の整数(ゼロを含まない)か否かを返す
     * @param string $str
     * @return bool
     */
    public static function isPositiveInterger($str) {
        if(1 !== preg_match('/\A[1-9][0-9]*\z/u', $str)) {
            return false;
        }
        return true;
    }
    /**
     * (>= 0) の整数数字か否かを返す
     * @param string $str
     * @return bool
     */
    public static function isGteZeroInteger($str) {
        if(1 !== preg_match('/\A[0-9]+\z/u', $str)) {
            return false;
        }
        if(strlen($str) >= 2 && substr($str, 0, 1) === '0') {
            return false;
        }
        return true;
    }
    /**
     * 文字がBMP外かどうかを返す
     *
     * 4バイト以上であればBMP外とみなす
     * @param string $utf8Char UTF-8 の1文字
     * @return bool BMP外かどうか
     * @since 1.2.0
     */
    public static function isOuterBmpUnicode($utf8Char) {
        $strHex = bin2hex($utf8Char);
        if(strlen($strHex) > 6) {
            return true;
        }
        return false;
    }
    /**
     * 改行コードを取り除いて返す
     * @param string $str
     * @param bool $rmCr CR(0x0d) を取り除くか
     * @param bool $rmLf LF(0x0a) を取り除くか
     * @return string
     */
    public static function removeCrLf($str, $rmCr=true, $rmLf=true) {
        if($rmCr) {
            $str = str_replace("\r", '', $str);
        }
        if($rmLf) {
            $str = str_replace("\n", '', $str);
        }
        return $str;
    }
    /**
     * 文字列がUTF-8かどうかを返す
     * @param string $str
     * @return bool
     */
    public static function isUtf8($str) {
        if(1 === preg_match('//u', $str)) {
            return true;
        }
        return false;
    }
    /**
     * 改行コードを変換して返す
     * @param string $str
     * @param string $newEol "\n", "\r", "\r\n"
     * @return string
     * @since 1.1.0
     */
    public static function convertEol($str, $newEol="\n") {
        return strtr($str, array_fill_keys(array("\r\n", "\r", "\n"), $newEol));
    }
    /**
     * 文字列中に制御文字が存在するか否かを返す
     * $cchars を指定しない場合は、「水平タブ、CR、LF」を除いた1f以下のものがすべて対象となる
     *
     * 00=NUL 01=SOH 02=STX 03=ETX 04=EOT 05=ENQ 06=ACK 07=BEL
     * 08=BS  09=HT  0a=LF  0b=VT  0c=FF  0d=CR  0e=SO  0f=SI
     * 10=DLE 11=DC1 12=DC2 13=DC3 14=DC4 15=NAK 16=SYN 17=ETB
     * 18=CAN 19=EM  1a=SUB 1b=ESC 1c=FS  1d=GS  1e=RS  1f=US
     * @param string $str
     * @param int[] $cchars 制御文字扱いするASCIIコードリスト
     * @return bool
     */
    public static function hasControlChars($str, $cchars=array()) {
        $asciiCchars = array(
            '\0',   "\x01", "\x02", "\x03,", "\x04", "\x05", "\x06", "\x07",
            "\x08", "\x09", "\x0a", "\x0b,", "\x0c", "\x0d", "\x0e", "\x0f",
            "\x10", "\x11", "\x12", "\x13,", "\x14", "\x15", "\x16", "\x17",
            "\x18", "\x19", "\x1a", "\x1b,", "\x1c", "\x1d", "\x1e", "\x1f",
        );
        // デフォルトは 09(HT), 0a(LF), 0d(CR) を除くASCII制御文字をすべて拒否
        if($cchars === array()) {
            $cchars = $asciiCchars;
            unset($cchars[0x09], $cchars[0x0a], $cchars[0x0d]);
        }
        $strCchars = '';
        foreach($cchars as $c) {
            $strCchars .= $c;
        }
//        if(1 === preg_match('/\A[^:cntrl:]\z/u', $str)) {
        if(1 === preg_match('/['.$strCchars.']/u', $str)) {
            return true;
        }
        return false;
    }
    /**
     * 指定文字種・文字長で極力ランダムな文字列を生成して返す
     * @param string $chars 使用する文字のリスト
     * @param int $length 作成する文字列の長さ
     * @return string
     * @uses mcrypt
     * @deprecated 1.1.0
     * @see createRandomString()
     */
    public static function rand($chars, $length) {
        if(strlen($chars) === 0 || $length <= 0) {
            return '';
        }
        return static::createRandomStringMcrypt($chars, $length);
    }
    /**
     * 指定文字種・文字長で極力ランダムな文字列を生成して返す
     * @param string $chars 使用する文字のリスト
     * @param int $length 作成する文字列の長さ
     * @return string
     * @uses openssl
     * @since 1.1.0
     */
    public static function createRandomString($chars, $length) {
        $bin = openssl_random_pseudo_bytes($length);
        return static::bin2String($bin, $chars);
    }
    /**
     * 指定文字種・文字長で極力ランダムな文字列を生成して返す
     * libmcrypt は長期間メンテされていないので openssl を使う方がよい
     * @param string $chars 使用する文字のリスト
     * @param int $length 作成する文字列の長さ
     * @return string
     * @uses mcrypt
     * @deprecated 1.1.0
     * @see createRandomString()
     */
    public static function createRandomStringMcrypt($chars, $length) {
        $bin = mcrypt_create_iv($length, MCRYPT_DEV_URANDOM);
        return static::bin2String($bin, $chars);
    }
    /**
     * バイナリを文字列に変換して返す
     * @param string $bin
     * @param string $chars 使用する文字列の羅列
     * @return string
     */
    private static function bin2String($bin, $chars) {
        if(strlen($bin) === 0 || strlen($chars) === 0) {
            return '';
        }
        $charsLen = strlen($chars);
        $length = strlen($bin);
        $result = '';
        for($i = 0; $i < $length; $i++) {
            $result .= substr($chars, ord(substr($bin, $i, 1)) % $charsLen, 1);
        }
        return $result;
    }
}