PHPで、ある文字列の中に、特定の文字列が含まれているかを判定する際、完全一致なら、比較演算子 === で比較すればすぐですが、それ以外となると通常の比較演算では処理できないので、ereg()関数やpreg()関数などで処理することも多いと思います。
ただ、前方一致や後方一致、部分一致を行いたい場合は、それだけに正規表現を使うのもなんだかコストが高い。もっとシンプルに実装できないものか・・・。
例えば、JavaやC#でいうところのStringクラスのstartsWith()やendsWith()のようなことが出来れば・・・
という訳で、PHPで前方一致、後方一致、部分一致の比較を簡単に行う関数を作ってみました。
[php]
/**
* 前方一致
* $haystackが$needleから始まるか判定します。
* @param string $haystack
* @param string $needle
* @return boolean
*/
function startsWith($haystack, $needle){
return strpos($haystack, $needle, 0) === 0;
}
/**
* 後方一致
* $haystackが$needleで終わるか判定します。
* @param string $haystack
* @param string $needle
* @return boolean
*/
function endsWith($haystack, $needle){
$length = (strlen($haystack) - strlen($needle));
// 文字列長が足りていない場合はFALSEを返します。
if($length < 0) return FALSE;
return strpos($haystack, $needle, $length) !== FALSE;
}
/**
* 部分一致
* $haystackの中に$needleが含まれているか判定します。
* @param string $haystack
* @param string $needle
* @return boolean
*/
function matchesIn($haystack, $needle){
return strpos($haystack, $needle) !== FALSE;
}
[/php]
上記コードの検証結果は以下を参照
検証用コード (test.php)
[php]
< ?php
$target = array(
'mfsmax.docomo.ne.jp',
'lsean.ezweb.ne.jp',
'mx.softbank.ne.jp',
'mail.disney.ne.jp',
'mx.mailsv.softbank.jp',
'mail2.pdx.ne.jp',
'mailmlb.emnet.ne.jp',
'ne.jp',
'.ne.jp',
'ne.jp.ne.jp',
'foo.ne.jp.bar.net',
);
$search = '.ne.jp';
print "n";
print 'SIMPLE STRING PATTERN MATCHING TEST' . "\n";
print "***********************************\n";
foreach($target as $str){
print $str . "\n";
print 'startsWith: ';
print startsWith($str, $search) ? 'true' : 'false'; 'false';
print "\n";
print 'endsWith: ';
print endsWith($str, $search) ? 'true' : 'false'; 'false';
print "\n";
print 'matchesIn: ';
print matchesIn($str, $search) ? 'true' : 'false'; 'false';
print "\n";
print "-----------------------\n";
}
function startsWith($haystack, $needle){
return strpos($haystack, $needle, 0) === 0;
}
function endsWith($haystack, $needle){
$length = (strlen($haystack) - strlen($needle));
if($length < 0) return FALSE;
return strpos($haystack, $needle, $length) !== FALSE;
}
function matchesIn($haystack, $needle){
return strpos($haystack, $needle) !== FALSE;
}
[/php]
実行結果
$ php -q test.php
SIMPLE STRING PATTERN MATCHING TEST
***********************************
mfsmax.docomo.ne.jp
startsWith: false
endsWith: true
matchesIn: true
-----------------------
lsean.ezweb.ne.jp
startsWith: false
endsWith: true
matchesIn: true
-----------------------
mx.softbank.ne.jp
startsWith: false
endsWith: true
matchesIn: true
-----------------------
mail.disney.ne.jp
startsWith: false
endsWith: true
matchesIn: true
-----------------------
mx.mailsv.softbank.jp
startsWith: false
endsWith: false
matchesIn: false
-----------------------
mail2.pdx.ne.jp
startsWith: false
endsWith: true
matchesIn: true
-----------------------
mailmlb.emnet.ne.jp
startsWith: false
endsWith: true
matchesIn: true
-----------------------
ne.jp
startsWith: false
endsWith: false
matchesIn: false
-----------------------
.ne.jp
startsWith: true
endsWith: true
matchesIn: true
-----------------------
ne.jp.ne.jp
startsWith: false
endsWith: true
matchesIn: true
-----------------------
foo.ne.jp.bar.net
startsWith: false
endsWith: false
matchesIn: true
-----------------------
No related posts.


最近のコメント