
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){
// 文字列長が足りていない場合は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;
}
上記コードの検証結果は以下を参照
検証用コード (test.php)
PHP:
<?php
'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 'SIMPLE STRING PATTERN MATCHING TEST' .
"\n";
print "***********************************\n";
foreach($target as $str){
print startsWith
($str,
$search) ?
'true' :
'false';
'false';
print endsWith
($str,
$search) ?
'true' :
'false';
'false';
print matchesIn
($str,
$search) ?
'true' :
'false';
'false';
print "-----------------------\n";
}
function startsWith($haystack, $needle){
return strpos($haystack,
$needle,
0) ===
0;
}
function endsWith($haystack, $needle){
if($length <0) return FALSE;
return strpos($haystack,
$needle,
$length) !==
FALSE;
}
function matchesIn($haystack, $needle){
return strpos($haystack,
$needle) !==
FALSE;
}
実行結果
$ 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
-----------------------
Related posts:
- PreparedなINSERT文を簡単に作る方法 PHPでWebアプリケーションなどを開発していて、SQL文を発行する際に、セキュア面や利便性などから、ADODBやPDOなどを用いて、Prepared Statementを使うSQLを書くこともあると思います。 その [...]...
関連記事はYARPP関連記事プラグインによって表示されています。
This entry was posted
on 金曜日, 2月 20th, 2009 at 13:53:22 and is filed under PHP, 開発.
You can follow any responses to this entry through the RSS 2.0 feed.
You can leave a response, or trackback from your own site.
Leave a Reply