仕事で、二つの文字列の空白の違いだけを検出する必要があって、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; } ?>
えぇ。問題なく動作しました。くそうおれの時間を返せッ!ちょっと前の俺!