B-Teck!

お仕事からゲームまで幅広く

​【PHP】英単語を複数形にする

変換ルール

  • 不規則変化の名詞は辞書を持ち、対応する単語に変換する
  • 不規則変化の辞書に単語が存在しない場合、以下の優先順位で単語を変換する
    1 . 末尾が「s、sh、ch、o、x」の場合は「es」をつける
    2 . 末尾が「f、fe」の場合は「ves」に置き換える
    3 . 末尾二文字が「母音 + y」の場合は「s」をつける
    4 . 3でマッチングしたもの以外で末尾が「y」の場合は「ies」に置き換える
    5 . 1~4でマッチングしなかったものの末尾に「s」を付ける

ソースコード

不規則変化する名詞は調べるのがだるかったのでいくつか抜粋。
実際使うときはある程度網羅したものを用意するべし。

<?php
function toPlural($in){
    // 不規則変化する名詞については配列に持つ(抜粋)
    // 作りこむ場合はしっかり辞書を用意しよう
    $dic = [
        "dictionary" => "dictionaries",
        "fox" => "foxes",
        "dish" => "dishes",
        "watch" => "watches",
        "gentleman" => "gentlemen",
        "leaf" => "leaves",
        "radio" => "radios",
        "class" => "classes",
        "knife" => "knives",
        "foot" => "feet"
    ];
    
    // 不規則変化の辞書に存在する場合は優先して変換
    if (array_key_exists($in, $dic)) {
        return $dic[$in];
    } else {
        $tmpStr = $in;
        
        // 規則のある文字を置換
        // 1. 末尾が「s、sh、ch、o、x」の場合は「es」をつける
        $tmpStr = preg_replace("/(s|sh|ch|o|x)$/","$1es",$tmpStr);
        
        // 2. 末尾が「f、fe」の場合は「ves」に置き換える
        $tmpStr = preg_replace("/(f|fe)$/","ves",$tmpStr);
        
        // 3. 末尾二文字が「母音 + y」の場合は「s」をつける
        $tmpStr = preg_replace("/(a|i|u|e|o)y$/","$1ys",$tmpStr);
        
        // 4. 3でマッチングしたもの以外で末尾が「y」の場合は「ies」に置き換える
        $tmpStr = preg_replace("/y$/","ies",$tmpStr);
        
        // 5. マッチングしなかったものの末尾に「s」を付ける
        if (!preg_match("/s$/",$tmpStr)) {
            $tmpStr = $tmpStr."s";
        }
        
        return $tmpStr;
    }
}

// テストコード
$test[] = "axis";
$test[] = "baby";
$test[] = "book";
$test[] = "box";
$test[] = "boy";
$test[] = "bus";
$test[] = "cat";
$test[] = "church";
$test[] = "class";
$test[] = "dictionary";
$test[] = "dish";
$test[] = "dog";
$test[] = "foot";
$test[] = "fox";
$test[] = "gentleman";
$test[] = "hero";
$test[] = "judge";
$test[] = "knife";
$test[] = "lady";
$test[] = "leaf";
$test[] = "photo";
$test[] = "pig";
$test[] = "play";
$test[] = "potato";
$test[] = "radio";
$test[] = "study";
$test[] = "toy";
$test[] = "video";
$test[] = "watch";


foreach($test as $value){
    echo toPlural($value)."\n";
}

【CSS】文章の字下げを行うCSS

1. 一行目の行頭を字下げする

  • テキストの一行目を字下げするtext-indentプロパティを利用する
    f:id:beatdjam:20160908010602p:plain
<style type="text/css">
  .sample1{
    text-indent:1em;
  }
</style>
<p class = "sample1">
どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。この書生というのは時々我々を捕えて煮て食うという話である。
</p>

2. 一行目以外の行頭を字下げする

  • text-indentプロパティにマイナスの値を設定して一行目だけ字上げする f:id:beatdjam:20160908010616p:plain
<style type="text/css">
  .sample2{
    padding-left:1em;
    text-indent:-1em;
  }
</style>
<p class = "sample2">
※どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。この書生というのは時々我々を捕えて煮て食うという話である。
</p>

【PHP】文字列を配列に格納する(マルチバイト対応)

PHPのstr_splitにマルチバイト版がなかったので書いた。

<?php

/**
 * mb_str_split
 * str_splitのマルチバイト版
 * 
 * @access public
 * @param  string   $string 分割する文字列
 * @param  int      $split_length 分割後の文字数
 * @return array    $retAry 分割後の配列
 * @throws $split_lengthの値が0以下の場合Warning発生
 *         ※str_split準拠
 */
function mb_str_split($string,  $split_length = 1){
    // 0以下が指定された場合Warningを発生させる
    if($split_length <= 0){
        trigger_error("mb_str_split(): The length of each segment must be greater than zero",
                      E_USER_WARNING);
    }
    
    // 文字列を配列に分解
    $aryString = preg_split("//u", $string, -1, PREG_SPLIT_NO_EMPTY);
    
    // 文字数の指定がない場合、配列の要素数が0の場合はこのまま返す
    if($split_length === 1 || count($aryString) === 0){
        return $aryString;
    }
    
    // 引数の文字列毎に配列に詰め直す
    $tmpVal = "";
    foreach($aryString as $key => $value){
        if(($key + 1) % $split_length !== 0){
            $tmpVal = $tmpVal.$value;
        }else{
            $retAry[] = $tmpVal.$value;
            $tmpVal = "";
        }
    }
    
    // 余りの文字列があれば配列に足す
    if($tmpVal !== ""){
        $retAry[] = $tmpVal;
    }
    
    return $retAry;
}

var_dump(mb_str_split("吾輩は猫である。名前はまだ無い。"));
var_dump(mb_str_split("This is a pen."));
var_dump(mb_str_split("吾輩は猫である。名前はまだ無い。。", 3));
var_dump(mb_str_split("This is a pen.", 3));