2

私はいくつかのテキストファイルを持っています。例:file1.txtおよびfile2.txt.

の内容file1.txtWalk word1 in the rain Walking in the rain is one of the most beautiful word2 experiences.

いくつかの条件があります:

  1. word1ANDがある場合word2、これらの 2 つの単語の間のテキストを取得したいので、取得し$betweenますin the rain Walking in the rain is one of the most beautifulword2また、テキストを取得したいので、取得し$contentますexperiences
  2. word1ORのみの場合word2(例 = Walk in the rain Walking in the rain is one of the most beautiful word1 experiences.) そして$between =''$contentすべてのテキスト ->Walk in the rain Walking in the rain is one of the most beautiful word1 experiences.
  3. たとえば :word2の前にある場合、 $between = '' $content` はすべてのテキストです。word1Walk in word2 the rain Walking in the rain is one of the most word1 beautiful word1 experiences.and

ここに私のコードがあります:

//to get and open the text files
$txt = glob($savePath.'*.txt');
foreach ($txt as $file => $files) {
    $handle = fopen($files, "r") or die ('can not open file');
    $ori_content = file_get_contents($files);

//count the words of text, to reach until the last word
$words = preg_split('/\s+/',$ori_content ,-1,PREG_SPLIT_NO_EMPTY);
$count = count ($words);

$word1 ='word1';
$word2 ='word2';
    if (stripos($ori_content, $word1) && stripos($ori_content, $word2)){
        $between  = substr($ori_content, stripos($ori_content, $word1)+ strlen($word1), stripos($ori_content, $word2) - stripos($ori_content, $word1)- strlen($word1));
        $content  = substr($ori_content, stripos($ori_content, $word2)+strlen($word2), stripos($ori_content, $ori_content[$count+1])  - stripos($ori_content,$word2));
    }
    else 
    $content = $ori_content;

$q0 = mysql_query("INSERT INTO tb VALUES('','$files','$content','$between')") or die(mysql_error());

しかし、私のコードはまだ処理できません:

  1. 条件番号 2(上記)、結果が得られます。
  2. 条件番号3(上記)。$etween = 雨 雨の中を歩くことは、単語 1 で最も美しい単語 1 の体験の 1 つです。
  3. file1.txt で $ between を取得し、file2.txt ではなく、データベースの table between で取得した場合、データ file2.txt の場合、列の間で null にする必要があります。null にはなりませんが、他のテキスト ファイルの間で埋められます
  4. 最後の言葉にたどり着けない。

助けてください..よろしくお願いします!:)

4

2 に答える 2

1

パーサー ロジックを function にラップしましたparse_content

$txt = glob($savePath.'*.txt');
foreach ($txt as $file => $files) {
    $handle = fopen($files, "r") or die ('can not open file');
    $ori_content = file_get_contents($files);
    $word1 ='word1';
    $word2 ='word2';

    $result = parse_content($word1, $word2, $ori_content);
    extract($result);

    $q0 = mysql_query("INSERT INTO tb VALUES('','$files','$content','$between')") or die(mysql_error());

}


function parse_content($word1, $word2, $input) {
    $between = '';
    $content = '';

    $w1 = stripos($input, $word1);
    $w2 = stripos($input, $word2);

    if($w1 && $w2) {
        if($w2 < $w1) {
            // Case 3
            $content = $input;
        } else {
            // Case 1
            $reg_between = '/' . $word1 . '(.*?)' . $word2 . '/';
            $reg_content = '/' . $word2 . '(.*)$/';

            preg_match($reg_between, $input, $match);
            $between = trim($match[1]);
            preg_match($reg_content, $input, $match);
            $content = trim($match[1]);
        }
    } else if($w1 || $w2) {
        // Case 2
        $content = $input;
    } else {
        // Case 4
        $content = $input;
    }

    return compact('between', 'content');
}
于 2012-09-25T09:49:26.460 に答える
1

1つのステートメントが欠けているだけだと思います:

...
}
else {
    $between = '';
    $content = $ori_content;
}

$betweenおそらくこれをループで使用しているため、明示的に空の文字列に設定していない場合は、前のループの値を取得します:)

編集

また、位置を比較するのを忘れていました。

if (stripos($ori_content, $word1) && stripos($ori_content, $word2)){

次のようにする必要があります。

$pos1 = stripos($ori_content, $word1);
$pos2 = stripos($ori_content, $word2);
if (false !== $pos1 && false !== $pos2 && $pos1 < $pos2) {

編集 2

別物; NULLSQL はインジェクションを起こしやすく、この方法では値を適切に使用できません。この種の構文を使用することもできますが、PDOorを使用する方がより望ましいmysqliです。

$sql_between = is_null($between) ? 'NULL' : "'" . mysql_real_escape_string($between) . "'";
// apply the same treatment for `$files`, etc.
...
mysql_query("INSERT INTO tb VALUES('', $sql_files, $sql_content, $sql_between)");

このようにして、MySQL に設定$betweenし、適切に送信することができます。null

于 2012-09-25T09:47:27.967 に答える