Django Находит хэштеги в строке и Заменяет их, заключая в тег

#python #django #replace #find #hashtag

Вопрос:

Я создаю сайт в социальных сетях и хочу включить хэштеги. Например, если пользователь создает сообщение, подобное этому:

 Summer is gone. #sad #comeback #summer
 

Я хочу использовать python для замены всех вхождений # и слов, подобных этому:

 Summer is gone. <a href="http://127.0.0.1:8000/c/sad">#sad</a> <a href="http://127.0.0.1:8000/c/comeback">#comeback</a> <a href="http://127.0.0.1:8000/c/summer">#summer</a>
 

Это то, что у меня есть до сих пор:

     def clean_content(self):
        content = self.cleaned_data.get('content')
        content = profanity.censor(content) # (Unrelated Code)
        arr = re.findall(r"#(w )", content)
        replace_ar = []
        for hsh in arr:
            if len(hsh) < 80:
                if Category.objects.filter(name__iexact=hsh):
                    # Old Category, Added This To Category List (Unrelated Code)
                    replace_ar.append(hsh)
                else:
                    # New Category, Created Category, Then Added This To Category List (Unrelated Code)
                    replace_ar.append(hsh)
            else:
                # Don't do anything, hashtag length too long
       # No Idea What To Do With replace_ar. Need help here.
 

В приведенном выше коде я беру ввод текста html и нахожу все #{{слово}}. Затем я просматриваю их и проверяю, существует ли категория с таким именем или нет. Если это так, я просто добавляю его в эту категорию, а если нет, я создаю категорию, а затем добавляю ее. В обеих этих ситуациях я нажимаю на хэштег в replace_ar массиве.

Теперь я хочу заменить все хэштеги в replace_ar массиве URL-адресом, как в примере «Лето ушло» выше. Как бы я это сделал?

Ответ №1:

Чтобы заменить хэштеги (вида: «#имя категории») URL-адресом соответствующей категории:

 def clean_content(self):
    content = self.cleaned_data.get('content')
    arr = re.findall(r"#(w )", content)
    for hsh in arr:
        if len(hsh) < 80:
            full_hash = '#'   hsh
            if Category.objects.filter(name__iexact=hsh):
                content = content.replace(full_hash, f'<a href="http://127.0.0.1:8000/c/{hsh}/">#{hsh}</a>')
            else:
                content = content.replace(full_hash, f'<a href="http://127.0.0.1:8000/c/{hsh}/">#{hsh}</a>')
 

Обратите внимание, что вы должны использовать reverse вместо жесткого кодирования URL-адрес.

Комментарии:

1. Если вы хотите отредактировать свой ответ на мой рабочий код, вы можете ознакомиться с моим рабочим кодом здесь: textdoc.co/kOhJgeENHf1GtyDz