Многие посты в Instagram заканчиваются множеством хэштегов, например:
"This is one of the amazing Mountains you can find in the National Forest Park in #Zhangjiajie #Chinawhich is where James Cameron drew his inspiration for the flying mountains in #Avatar..
Credit: @phototravelnomads
#pictoura #gydr
#destinationearth #earthpix #ourlonelyplanet#wonderful_earthLife #timeoutsociety#fantastic_earthpics #liveoutdoors #igglobalclub#awesomeearth #mist_vision #earthdeluxe
# #worldbestgram #mthrworld #fantastic_earth#famouscaptures #destination_wow #dreamlifepix#wonderful_places #igworldclub #ig_global_life
#natureaddict #beautifuldestinations #traveler #guider#locals"
Я пытаюсь обработать подписи, чтобы удалить коллекцию хэштегов в конце, оставляя остальные нетронутыми. Каков будет хороший подход к этому? Я уверен, что смогу найти способ грубой силы, но я надеюсь получить некоторые мысли об элегантном решении. Не должен быть реальным кодом. 🙂
Редактировать за комментарий Берна: Ожидаемый результат будет:
"This is one of the amazing Mountains you can find in the National Forest Park in #Zhangjiajie #Chinawhich is where James Cameron drew his inspiration for the flying mountains in #Avatar..
Credit: @phototravelnomads"
Отредактируйте согласно ответу Алана Мура: Это работает довольно хорошо, но не в каждой ситуации. Например, если входной текст будет:
"This is one of the amazing Mountains you can find in the National Forest Park in #Zhangjiajie #Chinawhich is where James Cameron drew his inspiration for the flying mountains in #Avatar"
… это будет отрезано от «#Zhangjiajie» на.
Я думаю, что, возможно, требуется немного больше логики, возможно, разбить строку на массив; проверка, заканчивается ли он хэштегами; если так, то сколько; если больше X (4?), отрежьте его от первого в последней полной серии.
Похоже, это сделает это:
$result = preg_replace('/#[#\w\s]*\z/', '', $subject);
Регулярное выражение соответствует хешу (#
), за которым следует ноль или более символов, составляющих хэштеги, плюс пробел, разделяющий их ([#\w\s]*
), за которым следует конец строки (\z
).
\w
эквивалентно [A-Za-z0-9_]
, Если в хэштегах разрешены другие символы или не разрешены цифры, дайте мне знать, и я обновлю регулярное выражение.
ОБНОВЛЕНИЕ: Если вы хотите удалить все робо-теги, оставляя легитимные, вероятно, нет надежного способа — конечно, не только с помощью регулярных выражений. Тем не менее, это удалит все, кроме первого линия из хэштегов:
$result = preg_replace('/^(#[#\w\h]+\R)#[#\w\s]*\z/m', '$1', $subject);
\h
соответствует только горизонтальному пробелу (пробел, табуляция, nbsp …) и \R
соответствует любому разделителю строк (\r\n
или любой отдельный вертикальный пробел).
Что касается хештэгоподобных вещей в тексте, это не коснется их, потому что они привязаны к концу текста. Якорь начала строки (^
в многострочном режиме) на самом деле не требуется, но это может помочь будущим читателям регулярного выражения (включая вас) понять, что он делает. Конечно, комментарии помогут еще больше. 😉
Если я правильно понимаю, должно работать следующее:
$hashTag="pictoura #gydr
destinationearth #earthpix #ourlonelyplanet#wonderful_earthLife #timeoutsociety#fantastic_earthpics #liveoutdoors #igglobalclub#awesomeearth #mist_vision #earthdeluxe
#worldbestgram #mthrworld #fantastic_earth#famouscaptures #destination_wow #dreamlifepix#wonderful_places #igworldclub #ig_global_life
natureaddict #beautifuldestinations #traveler #guider#locals";
echo preg_replace('/(#.*\s*)/','',$hashTag);
Что выводит:
pictoura destinationearth natureaddict
Удачи!!