Intereting Posts
Правильное использование заголовка PHP: «Content-language: …»); PHP Json Encode PDO :: FETCH_ASSOC Расчет расстояний между двумя точками в Laravel код ":" в php Ошибка анализа: ошибка синтаксиса, неожиданный $ end в home / search.php в строке 65 Показывать имя пользователя после входа пользователя в систему Использовать PHP для форматирования входного SQL-запроса как HTML? SMTP-адрес электронной почты не отправляется на iPhone cordova WebApp, работая в браузере? Насколько эффективна техника honeypot против спама? Динамически заполняющая веб-страница с загруженным файлом с использованием PHP / JS PHP: возвращает строку между двумя символами Сингулярное декомпозиция значений (SVD) в PHP Как мне импортировать продукты в Magento, используя прямое подключение к базе данных Опубликовать в OLX с помощью php или любой другой альтернативы php include_once не работает, несмотря на наличие файла и 777 разрешений

Поиск @mentions в строке

Пытаясь заменить все вхождения @mention на якорный тег, до сих пор у меня есть:

$comment = preg_replace('/@([^@ ])? /', '<a href="/$1">@$1</a> ', $comment); 

Возьмем следующую строку образца:

 "@name kdfjd fkjd as@name @ lkjlkj @name" 

Пока что все соответствует, но я хочу проигнорировать этот единственный символ «@». Я попытался использовать «+» и «{2,}» после «[^ @]», который, как я думал, обеспечит минимальное количество совпадений, но он не работает.

Solutions Collecting From Web of "Поиск @mentions в строке"

Замените квант вопросительного знака ( ? ) («Необязательно») и добавьте + («один или несколько») после вашего класса символов:

 @([^@ ]+) 

Регулярное выражение

 (^|\s)(@\w+) 

Мог бы быть тем, что тебе нужно.

Это в основном означает начало строки или пробел, затем символ @, сопровождаемый 1 или более символами слова.

Например

 preg_match_all('/(^|\s)(@\w+)/', '@name1 kdfjd fkjd as@name2 @ lkjlkj @name3', $result); var_dump($result[2]); 

Дает тебе

 Array ( [0] => @name1 [1] => @name3 ) 

Мне нравится ответ Петаха, но я немного поправил его

 preg_replace('/(^|\s)@([\w_\.]+)/', '$1<a href="/users/$2">@$2</a>', $text); 

Основные отличия:

  • символ @ не включен. Это только для отображения, не должно быть в URL-адресе
  • также позволяет _ и . символы
  • в замене я добавил $1 в начале, чтобы сохранить пробелы

Замена ? с + будет работать, но не так, как вы ожидаете.

Ваше выражение не соответствует @name в конце строки.

 $comment = preg_replace('#@(\w+)#', '<a href="/$1">$0</a> ', $comment); 

Это должно делать то, что вы хотите. \w+ обозначает букву (a-zA-Z0-9)

Пытаться:

 '/@(\w+)/i' 

используйте этот код

 $comment = preg_replace('/@([^(@|\s)]+)/', '<a href="/$1">@$1</a>', $comment); 

отлично работает и проверяется.

наслаждаться