0

ディレクトリ内のファイルからテキストを読み取って、画像の下に説明テキストとして表示させようとしています。前のセクションで問題が発生した場合を除いて、STRIPOS関数を使用してテキストの各部分を分離することができました。最後のセクションは「説明:」というタイトルで、実際には複数の行に分かれています。「説明:」という行だけを表示する方法がわかりません。「説明:」からファイルの最後まで印刷したい。このメッセージにコードとテキストファイルを投稿します。

$dirname = 'data';

$dirhandle = opendir($dirname);

$housestextarray = array();

if ($dirhandle)
        {
            while (false !==($file = readdir($dirhandle)))
            {
                if ($file !='.' && $file !='..')
                {
                    array_push($housestextarray, $file);
                }
            }

            closedir($dirhandle); 
        }

    sort($housestextarray);


    foreach ($housestextarray AS $housedescription)
        {
            $housetext = '';

            $description = '';

            $pos = stripos($housedescription, 'house_');

            if ($pos === false)
            {
                //nothing
            } else {
                    $lines_in_file = count(file($housedescription));

                    $fp=fopen($housedescription,"r");

                    for ($cntr = 1; $cntr <= $lines_in_file; $cntr++)
                {
                    $cityline=fgets($fp);
                    $priceline=fgets($fp);
                    $bedroomsline=fgets($fp);
                    $bathsline=fgets($fp);
                    $footageline=fgets($fp);
                    $realtorline=fgets($fp);
                    $grabberline=fgets($fp);

                    $descriptionline=fgets($fp);

                    //print $cityline;
                    //print $descriptionline;

                    //$housetext .= $line;

                    $citypos = stripos($cityline, 'City:');

                    if ($citypos === false)  //found the city line first time
                    {
                        //nothing
                    }
                    else
                    {
                        $city= $cityline."<br />\n";
                        //print $city;
                    } 

                    $pricepos = stripos($priceline, 'Price:');

                    if ($pricepos === false)  //found the city line first time
                    {
                        //nothing
                    }
                    else
                    {
                        $price = $priceline."<br />\n";
                        //print $price;
                    } 

                    $bedroomspos = stripos($bedroomsline, 'Bedrooms:');

                    if ($bedroomspos === false)  //found the city line first time
                    {
                        //nothing
                    }
                    else
                    {
                        $bedrooms = $bedroomsline."<br />\n";
                        //print $bedrooms;
                    } 

                    $bathspos = stripos($bathsline, 'Baths:');

                    if ($bathspos === false)  //found the city line first time
                    {
                        //nothing
                    }
                    else
                    {
                        $baths = $bathsline."<br />\n";
                        //print $baths;
                    } 

                    $footagepos = stripos($footageline, 'Footage:');

                    if ($footagepos === false)  //found the city line first time
                    {
                        //nothing
                    }
                    else
                    {
                        $footage = $footageline."<br />\n";
                        //print $footage;
                    } 

                    $realtorpos = stripos($realtorline, 'Realtor:');

                    if ($realtorpos === false)  //found the realtor line first time
                    {
                        //nothing
                    }
                    else
                    {
                        $realtor = $realtorline."<br />\n";
                        //print $realtor;
                    } 

                    $grabberpos = stripos($grabberline, 'Grabber:');

                    if ($grabberpos === false)  //found the grabber line first time
                    {
                        //nothing
                    }
                    else
                    {
                        $grabber_formatted = str_replace('Grabber:','', $grabberline);
                        $grabber = "<h3>".$grabber_formatted."</h3><br />\n";
                        //print $grabber;
                    } 

                    $descriptionpos = stripos($descriptionline, 'Description: ');
                                                                    if ($descriptionpos === false)  //found the description line first time
                    {
                        //nothing
                    }
                    else
                    {
                        $description .= $descriptionline."<br />";

                        //print $description;

                    }
                }
                    $output = $grabber."<br/>".$city.$bedrooms.$baths;
                    $output .= $price.$footage.$realtor."<br />";
                    $output .= "<br />".$description."<br />";

                    print $output;

            }   

そして、これがテキストファイルの内容の例です(6つのファイルのうちの1つ):

市:OceanCove
価格:$ 950,000
寝室:5
バス:3
映像:3000
sq。ft。不動産業者:Shirley Urkiddeng
グラバー:素晴らしい景色を望む素晴らしい家!
説明:
ゴージャスな珊瑚の峡谷を見下ろす景色を眺めながら、リビングのソファから夕日を眺めたり、バックポーチから日の出を眺めたりするのに飽きることはありません。一生に一度の機会!

Brandenの助けを借りて更新されたコード:

    function houseDescriptions()
{
    //$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
    //$dirname = $DOCUMENT_ROOT.'data';
$dirname = 'data';

$dirhandle = opendir($dirname);

$housestextarray = array();

if ($dirhandle)
        {
            while (false !==($file = readdir($dirhandle)))
            {
                if ($file !='.' && $file !='..')
                {
                    array_push($housestextarray, $file);
                }
            }

            closedir($dirhandle); 
        }

    sort($housestextarray);


    foreach ($housestextarray AS $housedescription)
        {
                        $housetext = '';

                        $description = '';

                        $data ="";

                        $pos = stripos($housedescription, 'house_');

                        if ($pos === false)
                        {
                            //nothing
                        } else {
                            $file_handle = fopen($housedescription, "r");
                    $data = "";
                    while (!feof($file_handle)) {
                       $filestrings .= fgets($file_handle);
                    }
                    fclose($file_handle);

                    //You'll need to double check the Regex if it doesn't work.
                    $data = preg_split('#\b(City:|Bedrooms:|Baths:|Footage:|Realtor:|Grabber:|Description:)\b#', $filestrings);

                    $city = $data[0];
                    $bedrooms = $data[1];
                    $baths = $data[2];
                    $footage = $data[3];
                    $realtor = $data[4];
                    $grabber = $data[5];
                    $description = $data[6];                    
                    $output = $grabber."<br />".$city.$bedrooms.$baths;
                    $output .= $price.$footage.$realtor."<br />";
                    $output .= "<br />".$description."<br />";

                    print $output;

            }   

        }
        //return $output;
}
4

1 に答える 1

0

適切な正規表現で更新

fgetsは、テキストファイルから文字列、特に長い文字列を取得しようとすると問題が発生する可能性があります。テキスト編集プログラムでは表示されない改行がファイル内にある場合があります。これを行うためのより良い方法は、テキストファイルからすべての情報を取得して文字列に格納し、preg_split()を使用してすべての検索を処理することです。以下のこのコード(私の正規表現が正しいと仮定すると、再チェックが必要になる場合があります)は、テキストファイルからすべての変数を取得します。

//Append the file location to the file name
$housedescription = $dirname."/".$housedescription;

//Get all contents of the file and save them into $filestrings
$file_handle = fopen($housedescription, "r");
$data = "";
while (!feof($file_handle)) {
   $filestrings .= fgets($file_handle);
}
fclose($file_handle);

//Remove any pesky \n newlines that were added by the text file
$filestring = preg_replace("/[\n\r]/","",$filestrings); 

//Case Sensitive Regex Search, split the string into an array based on the keywords
$data = preg_split('/(City:|Price:|Bedrooms:|Baths:|Footage:|Realtor:|Grabber:|Description:)/', $filestring, -1, PREG_SPLIT_NO_EMPTY);

//Save all the keywords to vars
$city = "City: ".$data[0];
$bedrooms = "Bedrooms: ".$data[1];
$baths = "Baths: ".$data[2];
$footage = "Footage: ".$data[3];
$realtor = "Realtor: ".$data[4];
$grabber = "Grabber: ".$data[5];
$description = "Description: ".$data[6];

$ filestring = preg_replace( "/ [\ n \ r] /"、 ""、$ filestrings);が追加されていることに注意してください。これにより、テキストファイルにあった余分な新しい行が削除されるため、不要な行はあり
ません。

もちろん、絶対的な理想は、すべてのデータを.txtファイルではなくmysqlデータベースに保存することです。これは、データアクセスがより安全で、はるかに高速であるためです。ただし、.txtを使用する場合は、同じファイルを2回以上開かないようにしてください。

これから取るべきいくつかの注意事項:正規表現の使用方法fopenfgetspreg_replacepreg_split

于 2012-07-30T18:56:26.443 に答える