Пытаясь заменить все вхождения @mention на якорный тег, до сих пор у меня есть:
$comment = preg_replace('/@([^@ ])? /', '<a href="/$1">@$1</a> ', $comment);
Возьмем следующую строку образца:
"@name kdfjd fkjd as@name @ lkjlkj @name"
Пока что все соответствует, но я хочу проигнорировать этот единственный символ «@». Я попытался использовать «+» и «{2,}» после «[^ @]», который, как я думал, обеспечит минимальное количество совпадений, но он не работает.
Замените квант вопросительного знака ( ?
) («Необязательно») и добавьте +
(«один или несколько») после вашего класса символов:
@([^@ ]+)
Регулярное выражение
(^|\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);
отлично работает и проверяется.
наслаждаться