PHP фильтрует хештеги из строки и записывает результат обратно в файл

я использую fopen() а также fwrite() записать некоторый контент JSON в файл.

Мой вопрос: Есть ли способ отфильтровать содержимое и записать в этот файл только определенные слова?

Например: я получаю "I #love #love #love you so #much my dear #brother!" из файла JSON, и я хотел бы написать только слово #love и только один раз в файл?

Вот пример того, что я получаю в $message:

<p>���� #follow4follow #followme #follow #smile #happy #instalike #instadaily #instagood #life4like #like #likeback #fashion #fun #like4like #sweettooth #spring #gopro #love #tbt</p>

Это моя отправная точка ($message записывает всю фразу в файл):

$myfile = fopen("custom/hashtag.php", "a");
fwrite($myfile, "<p>" . $message . "</p>" . " \n\r");

/////////////////////////////////////////////
//updated as @insertusernamehere suggested://
/////////////////////////////////////////////

$message = $comment['message']; //i get this from my json

$whitelist = array('#love');

// get only specific hashtag
preg_match_all('/' . implode('|', $whitelist) . '/', $message, $matches);

$unique_matches = array_unique($matches[0]);

$final = implode(' ', $unique_matches);

$myfile = fopen("custom/hashtag.php", "a");

// to avoid empty results
if (!empty($unique_matches)) {
fwrite($myfile, "<p class=\"hidden\">" . $final . "</p>" . " \n\r");
}

0

Решение

Вы можете решить это так:

$message = 'I #love #love #love you so #much!';

Получить все хэштеги с помощью регулярного выражения

preg_match_all('/#(\\w+)/', $message, $matches);

Получить только конкретные хэштеги

Это отказоустойчиво для подобных тегов, таких как #love а также #loveYou,

$whitelist = array('love', 'stackoverflow');
preg_match_all('/#\b(' . implode('|', $whitelist) . ')\b/', $message, $matches);

Выбрасывать дубликаты

$unique_matches = array_unique($matches[0]);

Объедините все хэштеги, используя пробел, например

print implode(' ', $unique_matches);
// prints "#love #much"

В качестве альтернативы, если вы хотите фильтровать список по разрешенным тегам впоследствии

// create a whitelist of hashtags
$whitelist = array('#love', '#stackoverflow');
// filter the result by this list
$unique_matches_filtered = array_intersect($whitelist, $unique_matches);
// prints only "#love"print implode(' ', $unique_matches_filtered);
2

Другие решения

С точки зрения чисто PHP, explode() свою строку в массив, используя пробел между словами в качестве разделителя, используйте array_unique() чтобы решить вашу двойную проблему, а затем использовать массив приемлемых слов для сравнения с вашим массивом, используя array_intersect(), Запишите результат в ваш файл.

Очень некрасивый код не для производства, но он работает:

<?php
$myallowedwordsarray = array("#love");

$stringtoclean = "I #love #love #love you so much!";

$arraytoclean = explode(" ", $stringtoclean);
$arraytocleanunique = array_unique($arraytoclean);
$cleanedarray = array_intersect($myallowedwordsarray, $arraytocleanunique);

echo $cleantext = implode($cleanedarray, " ");
0

По вопросам рекламы [email protected]