anoncom blog
  • ホーム
  • About
KEEP IN TOUCH

PHPでの簡易文字列の一致の判定

2月20
2009
Leave a Comment Written by anon
このエントリーをはてなブックマークに追加
はてなブックマーク - PHPでの簡易文字列の一致の判定
Share on LinkedIn

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.

Posted in PHP, 開発 - Tagged PHP, TIPS
SHARE THIS Twitter Facebook Delicious StumbleUpon E-mail
« Developers Summit 2009 (デブサミ)に行ってきた
» 接続先のサーバが応答するか判別する

No Comments Yet

コメントを残す コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

中の人

名前: あのん (anon) anon
詳細

 

2009年2月
日 月 火 水 木 金 土
« 1月   3月 »
1234567
891011121314
15161718192021
22232425262728

カテゴリー

  • Android
  • iPhone
  • Java
  • Linux
  • Mac
  • PC
  • PHP
  • Twitter
  • VOCALOID
  • イベント
  • サーバ
  • ソフトウェア
  • ネタ
  • ネット
  • モバイル
  • 無分類
  • 話題
  • 開発

アーカイブ

  • 2011年12月
  • 2011年9月
  • 2011年4月
  • 2011年3月
  • 2011年2月
  • 2011年1月
  • 2010年10月
  • 2010年8月
  • 2010年7月
  • 2010年6月
  • 2010年5月
  • 2010年3月
  • 2010年1月
  • 2009年11月
  • 2009年10月
  • 2009年8月
  • 2009年6月
  • 2009年4月
  • 2009年3月
  • 2009年2月
  • 2009年1月
  • 2008年12月
  • 2008年11月
  • 2008年7月
  • 2008年4月

最近の投稿

  • Galaxy Nexusを購入しました
  • さくらのVPSを使いながら行ったウェブサイトの3つの負荷対策
  • PSNの障害と個人情報漏洩について
  • ミクパ♪(初音ミク ライブパーティ 2011)に行ってきたよ
  • FirefoxからChromeに乗り換えてみた

最近のコメント

  • Twitterアカウント名が商標権侵害で訴えられそうになった話 に 2011年2月のこれだけ読めば分かる Web 制作者向け情報まとめ | ウェブル より
  • Twitterアカウント名が商標権侵害で訴えられそうになった話 に 2/1 (火) 前田敦子 豊胸疑惑でネット炎上(画像) | マスコミの気になるニュースをまとめ読み! より
  • Twitterアカウント名が商標権侵害で訴えられそうになった話 に クロネコ より
  • Twitterアカウント名が商標権侵害で訴えられそうになった話 に eamcet*[SEO対策調査自動更新ブログ] | とあるTwitterユーザー、商標権侵害を理由にTwitterアカウント名の変更を求められる より
  • Twitterアカウント名が商標権侵害で訴えられそうになった話 に 心は萌え より

Tweet on Twitter

EvoLve theme by Theme4Press  •  Powered by WordPress anoncom blog