PHPに限らずプログラムを組む場合、文字列検索をする場合が非常に多いことに気づきます。任意のファイルから入力された文字列を検索して表示するという処理が最も一般的でしょう。

アルゴリズム
1) 任意のファイルを配列に格納
2) 1行ずつ文字列が存在するかチェック
3) 文字列見つかったらその1行を配列へ格納
4) 最期に見つけてきた行を格納した配列を表示

使う関数
file, for, strpos, preg_match

■strposを使った文字検索

<?php
$str = "test";
$mystr = "This is a test.";
if(strpos($mystr, $str) > -1) { print "ari"; }
else { print "nasi"; }
?>

■preg_matchを使った文字検索

<?php
$str = "test";
$mystr = "This is a test.";
if(preg_match("/$str/", $mystr)) { print "ari"; }
else { print "nasi"; }
?>

では、特定のファイルを開いて、任意の文字列が含まれているかチェックし、含まれていたらその行を表示してみましょう。

ここに注意!
ファイルの中には該当する文字が含まれる行が一つとは限りません。結果が複数になる場合を考えて、見つけたら配列に1行丸ごと格納しましょう。

$stack = array();
array_push($stack, "apple");
array_push($stack, "orange");
print_r($stack);

※print_r は配列の中身を標準出力する関数です。

HTMLフォームを使った最終形

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>PHP moji Search</title></head>
<body>
<?php
$str = $_POST['mystr'];
$act = $_POST['act'];
$backhref = '<a href="moji_search.php">..back</a>'."\n";
/* */
if($act == "result") {
if(!$str) { errormess("karayo konoyaro"); }
$stack = array();
$ff = "[ファイル名]";
$data = file($ff);
/* */
for($i=0; $i<count($data); $i++) {
//  if(preg_match("/$str/", $data[$i])) {
  if(strpos($data[$i], $str) > -1) {
    $data[$i] = str_replace("\n",'',$data[$i]);
    array_push($stack, $data[$i]);
  }
}
/* */
if(count($stack) > 0){
  print "<ul>\n";
  for($i=0; $i<count($stack); $i++) {
    print "<li>".$stack[$i]."</li>\n";
  }
  print "</ul>\n";
} else { errormess("..no match"); }
print $backhref;
}
/* */
else {
print '<p>/etc/passwd Moji Check</p>'."\n";
print '<form action="moji_search.php" method="post">'."\n";
print '<input type="hidden" name="act" value="result">'."\n";
print '<input type="text" name="mystr" value="">'."\n";
print '<input type="submit" value="check">'."\n";
print '</form>'."\n";
}
/* */
function errormess($str) {
  global $backhref;
  print "<h3>$str</h3>\n";
  print $backhref;
  exit;
}
?>
</body>
</html>

PHPマスター関連記事