Извлечь данные c из строки, используя Regex (PHP) - PullRequest
1 голос
/ 16 января 2020

Моя цель - проверить, есть ли в сообщении смайлики или нет, если да, я собираюсь их преобразовать. У меня есть проблема, чтобы узнать, сколько смайликов в строке.

Пример:

$string = ":+1::+1::+1:"; //can be any string that has :something: between ::
  • цель здесь состоит в том, чтобы получить: +1: (все они), но я попробовал два шаблона и продолжаю получать только 1 совпадение.

    preg_match_all('/:(.*?):/', $string, $emojis, PREG_SET_ORDER); // $emojis is declared as $emojis='' at the beginning.
    preg_match_all('/:(\S+):/', $string, $emojis, PREG_SET_ORDER);
    

Остальная часть кода
после получения матчей я делаю это:

 if (isset($emojis[0])) 
   {
        $stringMap = file_get_contents("/api/common/emoji-map.json");
        $jsonMap = json_decode($stringMap, true);

        foreach ($emojis as $key => $value) {
            $emojiColon = $value[0];
            $emoji = key_exists($emojiColon, $jsonMap) ? $jsonMap[$emojiColon] : '';
            $newBody = str_replace($emojiColon, $emoji, $newBody);
        }
   }

Буду признателен за любую помощь или предложения, спасибо.

1 Ответ

1 голос
/ 17 января 2020

Я немного обновил ваше выражение:

preg_match_all('/\:(.+?)(\:)/', $string, $emojis, PREG_SET_ORDER);
echo var_dump($emojis);    
  • Теперь : экранирован, иначе его можно рассматривать как специальный символ.
  • Заменить * на +, таким образом, вы не будете сопоставлять два последовательных ::, но вам потребуется хотя бы один символ между ними.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...