ここ一ヶ月くらい、時間があるときに試行錯誤しているものがあります。
パステル・ミディリンの雑談掲示板のログが5000件を越え、
掲示板のCGIに付属している検索システムでは1000件が限度なので
過去ログ検索が行えないのです。
これは借りているレンタルサーバーのさくらネットに負荷がかかりすぎて
途中で落ちてしまうという現象が起きているため
そこで掲示板のログをどうにか検索できる方法はないのかなと考えていました。
データベースに過去ログを流し込み、それをSQLで検索できるような
システムであれば検索が可能だと思ったので
掲示板の過去ログ検索システムを一から作ることにしました。
掲示板のログは雑談掲示板はカンマ区切りのCSV形式ではなく
10件ずつの記事が結合されHTML形式で保存されているので
まずはそれを1件1件記事を切り離し、CSVの形にしました。
その後データベースにデータを流し込み、
PHPを使ってログを検索するシステムを現在作っています。
PHPはまったくさわったことがないので
(ここ数年仕事でさわっているのはJava)
まったく一からの勉強です。
データベースは仕事でDB2は使ったことあるのですが
個人ではとても買える代物ではないので(ライセンスだけで●百万します。オラクルよりは安いですが)
読者の方から提供してもらっているサーバーでMysqlを使用可能にしていただいたので
MySQLとPHPをネットで調べながら、空いた時間があったときに
コツコツとプログラミングをしてました。
でも、これができないんだなぁ。
最初につまったのは、マルチバイトの処理のところでした。
1バイトとは半角英数字のことで12345やabcdeなどのことで、
2バイトとは漢字とかひらがななのですが
例えば、「a」というキーワードで文字を検索すると「病」
という字も検索されてしまうんですよ。
これは「a」という文字をSJISの16進数に変換すると「61」となるのです。
次に「病」という文字をSJISの16進数に変換すると「95 61」となるのですね。
字はまったく違うのですが2バイト文字の目の下一桁が一致するため
aというキーワードで検索すると病というキーワードのものもひっかかってしまうという現象です。
他の文字でもこういうことは十分ありえるので
これをずっとネットで調べていたらマルチバイト関係の処理の仕方があったのでどうにかそれは回避しました。
次にはまったのは文字列を強調するための再帰部分です。
キーワードで検索された文字は強調するようにしているのですが
例えば、データベースに「abckdz」という文字があるとします。
「k」という文字列を検索したら
検索結果はabc<font color=red><b>k</b></font>dz となるのですね。
これがタグとして出力され
abckdz
となるわけです。
もし、「k」と「z」いう文字を検索したらAND検索で強調文字は
abc<font color=red><b>k</b></font>cd<font color=red><b>z</b></font>
とタグで出力され
表示上は
abckdz
となるわけです。
これを実現するには再帰という方法を使っていて
強調する関数を1つつくって1つ目のキーワードで検索したら
キーワードの件数だけその関数を再度呼び出すという処理をしているのですが
ここで困ったのは、タグの中に強調文字が入っている場合なのです。
先ほどの例で言うと
abckdz
↓
abckdz
↓
abckdz
というふうになっているのですが
これが「k」と「c」という文字を検索したら?
まず一度目の強調「k」で強調され
abc<font color=red><b>k</b></font>dz
になります。
次にこの文字列から「c」を検索するとタグの「font color」のcolorにcという文字がありますよね。
だから本当は
ab<font color=red><b>c</b></font><font color=red><b>k</b></font>dz
としたいのに実際は
ab<font color=red><b>c</b></font><font <font color=red><b>c</b></font>olor=red><b>k</b></font>dz
となり、fontの中のcにも強調文字が付加され、表示するHTMLはめちゃめちゃになってしまいます。
これを回避する方法がかなり大変でした。
次に大変だったのが、検索情報にタグが含まれると言うことです。
普通データベースから文字を検索するときはSQLというものを使って
データベースから該当するデータをひっぱってきます。
それを普通は表示すればいいのですが、今回はデータが元々HTML形式(タグを含む)で格納されているデータを検索しているので
「チェルト」などのキーワードで検索する場合は問題ないのですが
タグ文字を含むキーワード(「a」で検索すれば、アンカータグの<a href=></a> がひっかかってしまうし、
(「b」で検索すれば改行の<BR>がひっかかってしまうので
一度検索した後、タグを含むところをのぞき、検索+上記の再起による強調を使うということになってしまうのです。
このシステムができれば雑談掲示板を始め、過去の音楽掲示板やメーリングリストなど1万件以上の
過去ログが検索できるようになって、今6割方できています。
今仕事の合間などに独学でPHPをネットで調べながらプログラムを組んでいるのですが、
まだ完成は長そうです。
こんなの作ってます↓(バグありまくり、デバック文も残ってます)
<?php /// 2004.6.14 Makoto Yasuda Create /// ?>
<?php
//ヘッター読み込み
include ‘log_header.php’;
?>
<?php
//その他関数読み込み
include ‘../php_function/modoru.php’;//戻るボタン表示
include ‘../php_function/keyarraysort.php’;//配列ソート
include ‘../php_function/kyoucyou.php’;//検索文字列強調(無条件強調)
include ‘../php_function/debugPrintArray.php’;//デバック用
include ‘../php_function/kyoucyou_Nottagu.php’;//文字列の強調を行う(タグのところは行わない)
include ‘../php_function/firsttagu_search.php’;//文字列の中から最初のタグ「<~>」の文字列を抽出
include ‘../php_function/firsttagu_search_set_position.php’;//firsttagu_searchの拡張版で、文字列の中からタグの開始位置、終了位置もセットで返す
include ‘../php_function/stringsearch_pre_tagu.php’;//「タグ<>」があるまでの検索対象文字列を抽出
include ‘log_sql_select.php’;//ログ検索SQL
include ‘../php_function/check_taisyou.php’;//検索対象の文字列かを調べる
include ‘../php_function/check_kensuu.php’;//指定件数のみ表示するため、チェックを行う
include ‘../php_function/next_page_output.php’;//次のページのリンクを表示する
include ‘log_table.php’;//ログテーブル一覧
include ‘log_searchcount.php’;//検索件数をカウント
include ‘log_checkinput.php’;//入力チェック
?>
<?php
//初期値設定
$dbname = "●●";//DB名
$hostname = "●●";//ホスト名
$userid = "●●";//userid
$passwd = "●●";//password
$key_trim = trim($_GET[‘keyword’]);//trimを行ったキーワード(空文字対策)
$key_trim = trim(mb_convert_kana($key_trim, "s","SJIS"));//trimしたキーワードの中の全角スペースをすべて半角に変換
$kensuu = $_GET[‘kensuu’];//一度に表示する件数を指定
$current_page = $_GET[‘current_page’];//現在のページ数を取得
//変数初期化
$search_count = "0";//検索結果のカウンター
//入力チェックを通過したものみ実行
if(log_checkinput($key_trim)==true){
$key = rtrim(ltrim($_GET[‘keyword’]));//キーワード(両端のみtrimをかけたもの)
$key = mb_convert_kana($key, "s","SJIS");//キーワードの中の全角スペースをすべて半角に変換
$keyarray = explode(" ", $key);
//データベースに接続
if(!$con=mysql_connect($hostname,$userid,$passwd)){
echo "接続失敗";
exit;
}
//データベースを選択
$row=mysql_select_db($dbname,$con);
echo "検索文字列:<font color=#FF00FF><B>" . $key . "</B></FONT>の検索結果<BR>";
//チェックボックスでONになったものを取得
$checkboxarray = log_table_checkbox_get();
//検索件数を調べる
$sum_search_count = log_searchcount($checkboxarray,$keyarray,$con,$row);
echo "検索結果:<font color=#FF00FF>" . $sum_search_count . "件</FONT><BR>";
//最終ページでない場合
if($kensuu*$current_page < $sum_search_count){
echo "<font color=#FF00FF>".($kensuu*($current_page-1)+1)."件</font>~<font
color=#FF00FF>".$kensuu*$current_page."件</font>まで表示<BR>";
}
//最終ページの場合
else{
echo "<font color=#FF00FF>".($kensuu*($current_page-1)+1)."件</font>~<font
color=#FF00FF>".$sum_search_count."件</font>まで表示<BR>";
}
//チェックボックスの数だけループ
for($z=0;$z<=count($checkboxarray[$z]);$z++){
//echo $checkboxarray[$z];
$sql = log_sql_select($keyarray,$checkboxarray[$z]);
//select文を実行(コメント取得用)
if(!$res=mysql_query($sql)){
echo "SQL失敗";
mysql_close($con);//データベースを切断
exit;
}
if (!($rs = mysql_query($sql))) {
die;
}
else{
//検索件数が0件のとき→次のテーブルを見に行くので何もしない
if(mysql_num_rows($rs)=="0"){
//print ‘検索件数が0件です。検索条件を変えてください。<BR>’;
//modoru();
}
//検索件数が1件以上のとき
else{
//検索結果を表示
while($row=mysql_fetch_array($res)){
$id = $row["id"];
$comment = $row["comment"];
//keyarrayを文字列が大きい順に並び変える(検索文字列が複数で、同一の検索キーワードが含まれる場合は文字列が大きいものから強調文字にするため)
$keyarray = keyarraysort($keyarray);
//SQL取得のものが本当に検索対象のものなのかのチェックをして該当すれば強調表示。タグの中にヒットしたものであれば除外
if(check_taisyou($keyarray,$comment)===true){
$search_count++;
//echo "search_count".$search_count;
//指定件数のもののみ表示
if(check_kensuu($search_count,$kensuu,$current_page)===true){
//タグの中はのぞき、それ以外のところを強調する
$comment_red = kyoucyou_Nottagu($keyarray,$comment);
echo $comment_red ."<BR>";
}
}
}
mysql_free_result($res);
}
}
}
//次ページのリンクの表示
next_page_output($sum_search_count,$kensuu,$current_page,$keyarray);
//データベースを切断
mysql_close($con);
}
?>
<?php /// 2004.6.14 Makoto Yasuda Create /// ?>
<?php
//表示する件数のところかどうかのチェックをする
function check_kensuu($search_count,$kensuu,$current_page){
$start_count = $kensuu * $current_page – $kensuu;
$end_count = $kensuu * $current_page;
if($search_count >= $start_count && $search_count <= $end_count){
return true;
}
else{
return false;
}
}
?><?php /// 2004.6.14 Makoto Yasuda Create /// ?>
<?php
//文字列の強調を行う(タグのところは行わない)
function check_taisyou($keyarray,$comment){
$key_hit = "0";//キーワードがヒットするかのカウント
//タグを全部とる
$comment = strip_tags($comment);
for($i=0;$i<count($keyarray);$i++){
if(mb_strpos($comment,$keyarray[$i])!==false){
$key_hit++;
}
}
//キーワードの件数=ヒットの件数ならすべてがマッチしている
if($key_hit==count($keyarray)){
return true;
}
else{
return false;
}
}
?><?php /// 2004.6.11 Makoto Yasuda Create /// ?>
<?php
//デバック用の関数(配列を取得して出力する)
function debugPrintArray($array){
for($k=0;$k<count($array);$k++){
echo "array = " .$array[$k]."<BR>";
}
}
?>
<?php /// 2004.6.11 Makoto Yasuda Create /// ?>
<?php
//文字列の中から最初のタグ「<~>」の文字列を抽出
function firsttagu_search($text){
$tagu = "";//タグ
if(mb_strpos($text,"<")!==false && mb_strpos($text,"<")!==0){
$text_temp = mb_substr($text,mb_strpos($text,"<"));//タグの前の文字列を除去
$tagu = mb_substr($text_temp,mb_strpos($text_temp,">")+1);//タグの終了までをタグとして格納
}
//タグの後にすぐにタグがきている場合
else if(mb_strpos($text,"<")===0){
$tagu = mb_substr($text,mb_strpos($text_temp,">")+1);//タグの終了までをタグとして格納
}
//「<」がない場合→タグが存在しない
else{
return "";
}
return $tagu;
}
?><?php /// 2004.6.11 Makoto Yasuda Create /// ?>
<?php
//firsttagu_search(文字列の中から最初のタグ「<~>」の文字列を抽出)の拡張版で、
//文字列の中からタグの開始位置、終了位置もセットで返す
function firsttagu_search_set_position($text){
$tagu = "";//タグ
$position = "0";//位置
//echo "●mb_strpos1(<)=" .mb_strpos($text,"<");
//echo "●mb_strpos2(>)=" .mb_strpos($text,">");
//echo "length=".mb_strlen(mb_substr($text,mb_strpos($text,"<"),1));
//「<」が存在して、「>」が0ではなく、「<」の前に「>」がない場合
if(mb_strpos($text,"<")!==false && mb_strpos($text,"<")!==0
&& !(mb_strpos($text,"<") >= mb_strpos($text,">"))){
//if(mb_strpos($text,"<")!==false && mb_strpos($text,"<")!==0
){
/*if((mb_strpos($text,"<") > mb_strpos($text,">"))){
echo "●mb_strpos1(<)=" .mb_strpos($text,"<");
echo "●mb_strpos2(>)=" .mb_strpos($text,">");
}*/
$text_temp = mb_substr($text,mb_strpos($text,"<"));//タグの前の文字列を除去
/*if(mb_strpos($text,"<") >= mb_strpos($text,">")
){
echo "●text_temp=".$text_temp;
}*/
//echo "●text_temp=".$text_temp;
$tagu = mb_substr($text_temp,0,mb_strpos($text_temp,">")+1);//タグの終了までをタグとして格納
$position_start = mb_strpos($text,"<");//タグの開始位置
$position_end = mb_strpos($text,">")+1;//タグの開始位置
}
//タグの後にすぐにタグがきている場合
//else if(mb_strpos($text,"<")==0){
else if(mb_strpos($text,"<")===0 && mb_strlen(mb_substr($text,mb_strpos($text,"<"),1))!==0){
$tagu = mb_substr($text,0,mb_strpos($text,">")+1);//タグの終了までをタグとして格納
$position_start = 0;//タグの開始位置
$position_end = mb_strpos($text,">")+1;//タグの開始位置
}
//「<」の前に「>」がある場合、「>」より先のテキストで「<」がある場所を探しにいく
else if((mb_strpos($text,"<") > mb_strpos($text,">"))){
$next_search_text = mb_substr($text, mb_strpos($text,">")+1);
$tagu_array = firsttagu_search_set_position($next_search_text);//再帰
$tagu = $tagu_array[0];
$position_start = $tagu_array[1];
$position_end = $tagu_array[2];
echo "●";
}
//「<」がない場合→タグが存在しない
else{
$tagu = "";
$position_start = "-1";//タグの開始位置
$position_end = "-1";//タグの開始位置
//echo "★";
}
$tagu = array($tagu, $position_start, $position_end);
return $tagu;
}
?><?php /// 2004.6.11 Makoto Yasuda Create /// ?>
<?php
//キーワード配列を文字列が長い順にソートする(バブルソート)
function keyarraysort($keyarray){
// 最後の要素を除いて、すべての要素を並べ替える
for($i=0;$i<count($keyarray)-1;$i++){
// 下から上に順番に比較
for($j=count($keyarray)-1;$j>$i;$j–){
// 文字列の長さを比較して長いほうが上に入れ替える
if(mb_strlen($keyarray[$j]) > mb_strlen($keyarray[$j-1])){
$temp =$keyarray[$j];
$keyarray[$j]=$keyarray[$j-1];
$keyarray[$j-1]=$temp;
}
}
}
//デバック出力:keyarrayがソートされているかの確認
//debugPrintArray($keyarray);
return $keyarray;
}
?><?php /// 2004.6.11 Makoto Yasuda Create /// ?>
<?php
//文字を強調する関数
function kyoucyou($comment,$key){
//タグがあるかどうかを調べる
//echo "●comment=:".$comment;
//echo "●mb_strpos=".mb_strpos($comment,"<");
if(mb_strpos($comment,"<")===false){//タグがない場合通常強調ロジックへ
//echo "●key=".$key;
//echo "●comment=".$comment;
//検索キーワードがあれば
if(mb_strpos($comment,$key)!==false){
$comment1 = mb_substr($comment,0,mb_strpos($comment,$key));
//echo "●comment1=" .$comment1;
//echo "●debug1=".mb_substr($comment,mb_strpos($comment,$key),mb_strlen($key));
//echo "●debug2=".mb_strpos($comment,$key);
$comment2 = "<font color=RED><B>" . mb_substr($comment,mb_strpos($comment,$key),mb_strlen($key))
. "</B></font>";
//echo "●comment2=" .$comment2;
$comment3 = mb_substr($comment,mb_strpos($comment,$key)+mb_strlen($key));
//echo "●comment3(再帰前)=" .$comment3;
//残りの文字を再検索するため、再帰する
if(mb_strlen($comment3) >= mb_strlen($key)){
$comment3 = kyoucyou($comment3,$key);
}
$comment_sum = $comment1 . $comment2 . $comment3;
//echo "●comment_sum=".$comment_sum;
}
//検索キーワードがない場合
else{
$comment_sum = $comment;
}
return $comment_sum;
}
else{//タグがある場合(再帰による強調情報がきた場合)
$key_one = array($key);
return kyoucyou_Nottagu($key_one,$comment);
}
}
?><?php /// 2004.6.11 Makoto Yasuda Create /// ?>
<?php
//文字列の強調を行う(タグのところは行わない)
function kyoucyou_Nottagu($keyarray,$comment){
$text_red = "";//変換強調文字列
do{
//タグ「<>」があるまでの検索対象文字列を検索
$text_search = stringsearch_pre_tagu($comment);
//echo "●text_search(前)=" .$text_search;
//キーワード検索を行い、赤字で強調
for($i=0;$i<count($keyarray);$i++){
$text_search = kyoucyou($text_search,$keyarray[$i]);//強調文字を返す
}
//echo "●text_search(後)=" .$text_search;
//その後にくるタグ「<>」を検索
$taguarray = firsttagu_search_set_position($comment);
$tagu = $taguarray[0];
//echo "●tagu=" .$tagu;
//強調文字とタグと連結
$text_red = $text_red . $text_search . $tagu;
//また検索していないコメントを再格納(>の次から最後まで)
$tagu_start = $taguarray[1];
//echo "tagu_start=".$tagu_start;
$tagu_end = $taguarray[2];
//echo "tagu_end=".$tagu_end;
$comment = mb_substr($comment,$tagu_end);
//echo "●text_red=".$text_red;
}while($tagu_start!=="-1" || $tagu_end!=="-1");
return $text_red;
}
?><?php /// 2004.6.21 Makoto Yasuda Create /// ?>
<?php
//入力項目のチェック
function log_checkinput($key){
//キーワード入力チェック
if($key==”){
echo "<P><font color=red>検索条件を入力して下さい。</font></P>";
modoru("log_inputkey.php");
return false;
}
//チェックボックス入力チェック
if(log_table_checkbox_get()==”){
echo "<P><font color=red>検索対象ログを選択して下さい。</font></P>";
modoru("log_inputkey.php");
return false;
}
return true;
}
?>
<?php
function log_searchcount($checkboxarray,$keyarray,$con,$row){
$sum_search_count = "0";//検索結果件数(全テーブル総数)
//チェックボックスの数だけループ
for($z=0;$z<=count($checkboxarray[$z]);$z++){
$sql = log_sql_select($keyarray,$checkboxarray[$z]);
//select文を実行(コメント取得用)
if(!$res=mysql_query($sql)){
echo "SQL失敗";
mysql_close($con);//データベースを切断
exit;
}
if (!($rs = mysql_query($sql))) {
die;
}
else{
//select文を実行(カウント取得用)
$res_count=mysql_query($sql);
//検索件数が0件のとき→次のテーブルを見に行くので何もしない
if(mysql_num_rows($rs)=="0"){
//print ‘検索件数が0件です。検索条件を変えてください。<BR>’;
//modoru();
}
//検索件数が1件以上のとき
else{
$search_count = "0";
//検索件数をカウント
//該当件数をカウントするため、SQLの検索結果が本当に検索対象か調べる
while($row=mysql_fetch_array($res_count)){
$comment = $row["comment"];
if(check_taisyou($keyarray,$comment)===true){
$search_count++;
}
}
mysql_free_result($res);
}
}
$sum_search_count = $sum_search_count + $search_count;
}
return $sum_search_count;
}
?><?php /// 2004.6.18 Makoto Yasuda Create /// ?>
<?php
//検索SQL実行
function log_sql_select($keyarray,$checkbox_select){
$sql_key = "";
//キーワードのAND条件を作成
for($i=0;$i< count($keyarray);$i++){
$sql_key = $sql_key . "and comment like ‘%" . $keyarray[$i] .
"%’ ";
}
//SQL生成
$sql = "select id,comment from " . $checkbox_select ." where
id < 100 " . $sql_key . " order by id desc";//テストSQL
//SQLデバック
//echo "sql:".$sql."<BR>";
return $sql;
}
?>
<?php /// 2004.6.16 Makoto Yasuda Create /// ?>
<?php
//ログテーブル一覧
function log_table_name(){
$tablename[0] = array("mainbbs","mainbbsold","musicbbsold","mailinglist");
$tablename[1] = array("雑談掲示板","旧雑談掲示板","旧音楽/MIDI掲示板","メーリングリスト");
return $tablename;
}
//
function log_table_name_all_only(){
$tablename[0] = array("alltable");
$tablename[1] = array("全検索");
return $tablename;
}
//検索フォームでチェックボックスを出力
function log_table_checkbox_output(){
$tablename = log_table_name();
//チェックボックス表示
for($i=0;$i<count($tablename[0]);$i++){
echo "<input type=checkbox name=category[$i] value=".$tablename[0][$i].">".$tablename[1][$i]."<BR>";
}
//全検索
$tablename_all = log_table_name_all_only();
echo "<input type=checkbox name=categoryall[0] value=".$tablename_all[0][0].">".$tablename_all[1][0]."<BR>";
}
//チェックしているチェックボックスの名称を取得する(ただし全検索にチェックが入っている場合は無条件でcheckboxは全チェックの配列を返す)
function log_table_checkbox_get(){
$tablename = log_table_name();//tablename一覧取得
//全検索の場合はcheckboxarrayを上書きする
if(check_alltable()==true){
$tablename_check = $tablename[0];
}
//全検索にチェックが入っていない場合
else{
$tablename_check = "";
$check_count = 0;
for($i=0;$i<count($tablename[0]);$i++){
$checkbox[$i] = $_GET[‘category’][$i];
if($checkbox[$i]!=”){
$tablename_check[$check_count] = $checkbox[$i];
$check_count++;
}
}
/*
for($j=0;$j<=count($tablename_check[$j]);$j++){
echo "デバック1".$tablename_check[$j];
}
*/
}
return $tablename_check;
}
//全検索にチェックが入っているかどうかを調べる
function check_alltable(){
if($_GET[‘categoryall’][0]=="alltable"){
return true;
}
return false;
}
?>
<?php
//フッター読み込み
include ‘log_footer.php’;
?><?php /// 2004.6.21 Makoto Yasuda Create /// ?>
<?php
//検索入力画面に戻るリンクを表示する関数
function modoru($link){
echo "<a href=\"$link\">検索入力画面に戻ります</a>";
}
?><?php /// 2004.6.21 Makoto Yasuda Create /// ?>
<?php
//次ページへのリンクを表示する
function next_page_output($search_count,$kensuu,$current_page,$keyarray){
$keywordparam = "";
for($i=0;$i<count($keyarray);$i++){
if($i==0){
$keywordparam = urlencode($keyarray[$i]);
}
else{
$keywordparam = $keywordparam ."+" .$keyarray[$i];
}
}
$link = "?keyword=".$keywordparam;
$nextpage = $current_page + 1;
//チェックボックスでONになったものを取得
$checkboxarray = log_table_checkbox_get();
$checkstring = "";
for($z=0;$z<=count($checkboxarray[$z]);$z++){
$checkstring = $checkstring . "&category%5B".$z."%5D="
. $checkboxarray[$z];
}
$link = $link . $checkstring. "&kensuu=".$kensuu."¤t_page=".$nextpage;
//echo "search_count/kensuu=".(int)($search_count/$kensuu);
//echo "current_page=".$current_page;
//echo "kensuu=".$kensuu;
//echo "search_count=".$search_count;
//最後のページは何も表示をしない
if((int)($search_count/$kensuu) == $current_page – 1){
}
//最後のページー1のとき、残りの件数を計算する
else if((int)($search_count/$kensuu) == $current_page){
//echo "デバック1";
//echo "search_count=".$search_count;
$nokori = $search_count%$kensuu;
//echo "nokori=".$nokori;
echo "<a href=\"logsearch.php".$link."\"><DIV
align=center>次の".$nokori."件を表示する</DIV></a>";
}
//それ以外
else{
//echo "デバック2";
echo "<a href=\"logsearch.php".$link."\"><DIV
align=center>次の".$kensuu."件を表示する</DIV></a>";
//echo "<a href=\"logsearch.php".$link."\"><DIV
align=center>次のページを表示する</DIV></a>";
}
}
?><?php /// 2004.6.11 Makoto Yasuda Create /// ?>
<?php
//「タグ<>」があるまでの検索対象文字列を抽出。
function stringsearch_pre_tagu($text){
$text_search = "";//検索対象文字列
$taguarray = firsttagu_search_set_position($text);
$tagu = $taguarray[0];
//echo "●tagu=" .$tagu;
$tagu_start = $taguarray[1];
//echo "●tagu_start=" .$tagu_start;
$tagu_end = $taguarray[2];
//タグが存在すれば
if(firsttagu_search_set_position($text)!="-1"){
$text_search = mb_substr($text,0,$tagu_start);
}
//タグが存在しなければ
else{
$text_search = $text;
}
return $text_search;
}
?>
コメント