読者です 読者をやめる 読者になる 読者になる

Paradigm Shift Design

ISHITOYA Kentaro's blog.

空白の違いだけを検出する関数

仕事で、二つの文字列の空白の違いだけを検出する必要があって、xdiffを使おうと思ったんだけれどExtensionをビルドするのも面倒なので関数を書いてみた。

<?php
function check($str1, $str2){
    $lenStr1 = mb_strlen($str1);
    $lenStr2 = mb_strlen($str2);
    if($lenStr1 < $lenStr2){
        $temp = $str1;
        $str1 = $str2;
        $str2 = $temp;
        $lenStr1 = mb_strlen($str1);
        $lenStr2 = mb_strlen($str2);
    }

    for($i1 = 0, $i2 = 0; $i1 < $lenStr1; $i1++, $i2++){
        $c1 = mb_substr($str1, $i1, 1);
        $c2 = mb_substr($str2, $i2, 1);
        if($c1 === $c2){
            continue;
        }
        if($c1 == " " || $c1 == " "){
            $i1++;
        }
        if($c2 == " " || $c2 == " "){
            $i2++;
        }
        $c1 = mb_substr($str1, $i1, 1);
        $c2 = mb_substr($str2, $i2, 1);
        if($c1 !== $c2){
            return false;
        }
    }
    if($i1 != $i2){
        return 1;
    }
    return true;
}
?>

で、

<?php
$data[] = array("hoge ", "hoge");
$data[] = array("mogemoge", "moge moge゙");
$data[] = array("mogemoge", "fugafuga゙");
$data[] = array("sagesage", "sagesage゙");

foreach($data as $datum){
    $result = check($datum[0], $datum[1]);
    if($result === false){
        echo $datum[0] . " is differed with " . $datum[1] . "\n";
    }else if($result === 1) {
        echo $datum[0] . " and " . $datum[1] . " are same without blank\n";
    }else {
        echo $datum[0] . " and " . $datum[1] . " are same\n";
    }
}
?>

のようにして使うんだけれども・・・ここまで書いて、はたと気がついた。
普通にstr_replaceで空白除去してから比較すればいいんじゃないか・・・?

<?php
function check2($str1, $str2){
    if(strcmp($str1, $str2) === 0){
        return true;
    }
    $str1 = str_replace(array(' ', ' '), '',  $str1);
    $str2 = str_replace(array(' ', ' '), '',  $str2);
    if(strcmp($str1, $str2) === 0){
        return 1;
    }
    return false;
}
?>

えぇ。問題なく動作しました。くそうおれの時間を返せッ!ちょっと前の俺!