@rusgayfer

Как правильно сделать тег на php?

Хочу сделать тег, чтобы если есть ключевые слова в теге, то тег отображало, если нет ключевых слов, то не отображало.

Вот мой тег:

[keyText]#хештег|слово1,слово2,слово3[/keyText]

если есть ключевые слова, которые во второй половине после | (их может быть сколько угодно), то выводило #хештег. Не обязательно там должен быть хештег, может быть слово или словосочетание.

Вот код который написал:
$text = 'Уже наступило лето , а скоро наступит осень';
$tegs = '[keyText]#лето|лето,летний[/keyText] [keyText]#осень|осень,осенний[/keyText]';

if(strpos($tegs, "[keyText]") !== false) {

  $tegsStr = str_replace("[keyText]", "", $tegs);
  $tegsStr = str_replace("[/keyText]", "", $tegsStr); // Удаляю не нужные части тега
  $exploded_type = explode("|", $tegsStr); // Разделяю на слово и теги

  $tagsActive= false;

  $keys = trim(mb_strtolower($exploded_type[1], 'UTF-8'));
  $text_post = trim(mb_strtolower($text, 'UTF-8'));

  $text_post = str_replace([".", "\n"], " ", $text_post);
  $text_post = ltrim($text_post);

  $text_post = preg_replace("/\s{2,}/", " ", $text_post);
  $keys = preg_replace('/\s\s+/', ' ', $keys);
  $keys = str_replace(', ', ',', $keys);

  $key_array = explode(",", $keys);
  $text_array = explode(" ", $text_post);

  foreach ($text_array as $word) {
    if ($word != NULL) {
      if (in_array($word, $key_array)) {
        $tagsActive= true;
      }
    }
  }

  if (!$tagsActive) {
    $tegs = preg_replace('/\[keyText](.*)\[\/keyText]/', '', $tegs);
  } else {
    preg_match('/\[keyText](.*)\|/', $tegs, $matches, PREG_OFFSET_CAPTURE, 0);
    print_r($matches);
    $tegs = preg_replace('/\[keyText](.*)\[\/keyText]/', $matches[1][0], $tegs);
  }

}

echo $text.'<br>'.$tegs; // Должно получиться предложение с хештегами (если есть ключевые слова)


Когда есть один тег, то он работает, а когда несколько, то работает только последний. Как сделать конструкцию правильно? Знаю что нужно перебирать массивами, но не могу понять как. Может кто помочь, исправить этот код.
  • Вопрос задан
  • 121 просмотр
Решения вопроса 1
@dzhebrak
Проще всего в вашем случае будет:
  1. собрать ассоциативный массив возможных тегов (Тег => [слово1, слово2]) из строки с [keyText] и [/keyText]
  2. разбить строку $text по символам пунктуации
  3. найти вхождения из массива, полученного на шаге 1, в массиве, полученном на шаге 2

Код
$text = 'Уже наступило лето , а скоро наступит осень';
$tags = '[keyText]#лето|лето,летний[/keyText] [keyText]#осень|осень,осенний[/keyText]';

function getTags($tagsStr, $before='[keyText]', $after='[/keyText]')
{
    $posStart = 0;
    $posEnd = 0;
    $tags = [];

    while($posStart < mb_strlen($tagsStr)) {
        $posStart = mb_strpos($tagsStr, $before, $posStart);
        if($posStart === false) {
            break;
        }

        $posEnd = mb_strpos($tagsStr, $after, $posStart);
        if($posEnd === false) {
            break;
        }

        $tagLine = mb_substr($tagsStr, $posStart + mb_strlen($before), $posEnd - $posStart - mb_strlen($before)); 

        if(mb_strpos($tagLine, '|') !== false) {
            [$tag, $tagWordsAsStr] = explode('|', $tagLine);
            $tagWords = array_unique(array_filter(array_map('trim', explode(',', $tagWordsAsStr))));

            if($tagWords) {
                $tags[$tag] = $tagWords;
            }
        }

        $posStart = $posEnd + 1;
    }

    return $tags;
}

$textAsWords = array_map('mb_strtolower', array_unique(preg_split('/[\.\s,!()]+/u', $text)));
$foundedTags = [];

foreach (getTags($tags) as $tag => $words) {
    foreach ($words as $word) {
        if(in_array($word, $textAsWords)) {
            $foundedTags[] = $tag;
        }
    }
}

printf("%s<br>%s", $text, implode(', ', $foundedTags));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
03 дек. 2020, в 22:34
500 руб./за проект
03 дек. 2020, в 22:19
150000 руб./за проект
03 дек. 2020, в 21:54
300 руб./за проект