Как отформатировать данные ввода-вывода из скрипта

Я использовал скрипт для исключения списка слов из другого списка ключевых слов. Я хотел бы изменить формат вывода. (Я нашел сценарий на этом веб-сайте и внес некоторые изменения.)

Пример:

Фраза из результата: мое слово

Я хотел бы добавить кавычки: "мое слово"

Я думал, что я должен положить результат в new-file.txt и после этого переписать его, но я не понимаю, как зафиксировать результат. Пожалуйста, дайте мне несколько советов. Это мой первый скрипт :)

Вот код:

<?php
    $myfile = fopen("newfile1.txt", "w") or die("Unable to open file!");
    //    Open a file to write the changes - test
    $file = file_get_contents("test-action-write-a-doc-small.txt");
    //  In small.txt there are words that will be excluded from the big list  
    $searchstrings = file_get_contents("test-action-write-a-doc-full.txt");
    //  From this list the script is excluding the words that are in small.txt      
    $breakstrings = explode(',',$searchstrings);
    foreach ($breakstrings as $values){
      if(!strpos($file, $values)) {
        echo $values." = Not found;\n";
      } 
      else {
        echo $values." = Found; \n";
      }
    }
    echo "<h1>Outcome:</h1>";  
    foreach ($breakstrings as $values){
      if(!strpos($file, $values)) {
        echo $values."\n";
      } 
    }
    fwrite($myfile, $values); //    write the result in newfile1.txt - test

    //    a loop is missing?

    fclose($myfile); //    close newfile1.txt - test
?>   

В сценарии также есть небольшая ошибка. Однако он отлично работает, прежде чем вводить список слов в test-action-write-a-doc-full.txt и test-action-write-a-doc-small.txt, я должен поставить разрыв для первой строки, иначе он не найдет первое слово.

Пример:

В test-action-write-a-doc-small.txt словах:

выбрать, лол, файл, круто,

В test-action-write-a-doc-full.txt словах:

выбрать, плохой, компьютер, лол, сломать, файл.

Исход:

Pick = Not found -- вот ошибка.

Это происходит, если я не ставлю разрыв для первой строки в .txt

лол = найдено

файл = найден

Заранее благодарю за любую помощь! :)


person Krista    schedule 28.11.2015    source источник


Ответы (1)


Вы можете собрать принятые слова в массив, а затем склеить все эти элементы массива в один текст, который затем запишете в файл. Так:

echo "<h1>Outcome:</h1>";  
// Build an array with accepted words
$keepWords = array();
foreach ($breakstrings as $values){
  // remove white space surrounding word
  $values = trim($values);
  // compare with false, and skip empty strings
  if ($values !== "" and false === strpos($file, $values)) {
    // Add word to end of array, you can add quotes if you want
    $keepWords[] = '"' . $values . '"';
  } 
}
// Glue all words together with commas
$keepText = implode(",", $keepWords);
// Write that to file
fwrite($myfile, $keepText);

Обратите внимание, что вы должны писать не !strpos(..), а false === strpos(..), как описано в документации.

Обратите также внимание, что этот метод поиска в $file может дать неожиданные результаты. Например, если в вашей строке $file есть слово "misery", то слово "is" (если оно разделено запятыми в исходном файле) будет отклонено, так как оно находится в $file. Возможно, вы захотите просмотреть это.

Относительно второй проблемы

Тот факт, что он не работает без предварительного добавления разрыва строки в ваш файл, наводит меня на мысль, что это связано с Знак порядка байтов (BOM), который появляется в начале многих UTF-8 закодированных файлов. Обсуждаются проблема и возможные решения здесь и в другом месте .

Если это действительно проблема, я бы предложил два решения:

Используйте текстовый редактор, чтобы сохранить файл в кодировке UTF-8, но без спецификации. Например, notepad++ имеет такую ​​возможность в меню encoding.

Или добавьте это в свой код:

function removeBOM($str = "") {
    if (substr($str, 0,3) == pack("CCC",0xef,0xbb,0xbf)) {
        $str = substr($str, 3);
    }
    return $str;
}

а затем оберните все ваши file_get_contents вызовы этой функцией, например:

$file = removeBOM(file_get_contents("test-action-write-a-doc-small.txt"));
//  In small.txt there are words that will be excluded from the big list
$searchstrings = removeBOM(file_get_contents("test-action-write-a-doc-full.txt"));
//  From this list the script is excluding the words that are in small.txt

Это удалит эти забавные байты из начала строки, взятой из файла.

person trincot    schedule 29.11.2015
comment
Большое спасибо за Ваш ответ! Это очень мило с твоей стороны! Я попробовал первую часть, касающуюся котировок. 1. $keepWords = массив(); - сохраняет ВСЕ значения, не отсортированные. Итак, в newfile1.txt он сохраняет агрегированные значения, которые были у меня в файлах test-action-write-a-doc-small.txt и test-action-write-a-doc-full.txt. 2. $keepWords[] = '' . $значения . ''; - добавляет кавычки, но не для самого слова. Это рекламные кавычки после слова. Пример: Моё слово. Вторую часть попробую позже)) Еще раз спасибо! - person Krista; 29.11.2015
comment
Я обновил код и добавил два примечания под кодом. Это должно решить некоторые проблемы. Я также удалил echo из цикла, так как я думаю, что это приведет к неправильным выводам о том, где применяются кавычки. - person trincot; 29.11.2015
comment
еще раз спасибо за исправления! code Я сделал следующее: if(!strpos($file, $values)) { echo $values.\n; $значения = rtrim($значения); // простой rtrim также работает // Добавляем слово в конец массива $keepWords[] = $values."; //вы не можете ставить кавычки впереди, они все равно будут добавлены в конец.code - person Krista; 30.11.2015
comment
Чтобы добавить кавычки, у меня есть следующее решение: code‹?php $text = file_get_contents('newfile1.txt'); $массив = взорвать(\n, $текст); foreach($array as $ar) { $new_text.=$ar."; // добавляет кавычки впереди. Не знаю почему, но это работает. } file_put_contents('newfile1.txt', $new_text); ?›code - person Krista; 30.11.2015
comment
А по поводу пустой строки впереди, в принципе, я выяснил, что одну лишнюю строку надо поставить только для test-action-write-a-doc-small.txt. Что заставляет меня думать, что есть проблема с code $breakstrings = Explosion(',',$searchstrings); code потому что он может не проверять нулевой аргумент в code $file = file_get_contents(test-action-write-a-doc-small.txt); code . Но это только мое предположение. - person Krista; 30.11.2015
comment
Пожалуйста, перечитайте то, что я сказал о неиспользовании !strpos. Если вы говорите, что это работает с &#34;, это означает, что существует более широкий контекст, о котором я не знаю; какой-то HTML-контейнер, в котором это отображается, может быть, textarea или что-то в этом роде. Но я рад слышать, что эта часть работает! Для пустой строки впереди: вы не пробовали два предложенных мной решения? Если да, то каков был результат? - person trincot; 30.11.2015
comment
Привет, @trincot! Как твои дела? :) Когда я добавил !strpos, как вы предложили, он перестал показывать результаты для Outcome, однако я мог видеть их сохраненными в newfile1.txt. Это также не решило проблему для скобок. Их все же добавили в конце. Итак, я нашел другое решение. " или ' ' это не имеет значения, я могу использовать оба. Что касается пустой области, я попробовал ваше решение, но, возможно, я установил его неправильно, поэтому оно выдало мне ошибку. Я также пытался удалить utf -8 из кода.У меня такое ощущение, что проблема не в этом. - person Krista; 01.12.2015
comment
Я не предлагал добавлять !strpos. Я предложил изменить его на то, что рекомендуется в документации по PHP! Я не знаю, что вы имеете в виду под скобками. В любом случае, ваш код теперь изменился в нескольких аспектах, и эти комментарии не являются идеальным средством помочь вам. Если вам все еще нужен ответ, пожалуйста, опубликуйте новый вопрос вместе. В конце концов это даст вам более быстрое решение, так как больше людей снова начнут его просматривать. - person trincot; 01.12.2015
comment
Хорошо, нет проблем. Большое спасибо за вашу помощь! Я действительно многому научился с тобой! Итак, теперь я могу построить что-то, что решит мои потребности! :) - person Krista; 01.12.2015