Вопрос по php, regex – Нахождение @mentions в строке

3

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

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

Возьмите следующую примерную строку:

<code>"@name kdfjd fkjd [email protected] @ lkjlkj @name"
</code>

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

Только что понял: preg_replace ("/ @ ([^ @] +) /", "a href =" / $ 1 "& gt; @ $ 1 & lt; / a & gt; & apos; $ comment) ; Rob
не используйте пробелы в выражениях. привести к проблемам. вместо этого используйте\s Vipin Jain

Ваш Ответ

5   ответов
3

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

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

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

  • the @ symbol is not included. That's for display only, should not be in the URL
  • also allows _ and . symbols
  • in the replacement, I added $1 at the beginning to preserve the whitespace
2

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

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

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

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

Error: User Rate Limit Exceeded
8

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

@([^@ ]+)
Error: User Rate Limit Exceeded
0

Пытаться:

'/@(\w+)/i'

Error: User Rate Limit Exceededit parses and runsError: User Rate Limit Exceededit's not a parse errorError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded\bError: User Rate Limit Exceeded@Error: User Rate Limit Exceeded
ERROR:Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
6

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

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

Может быть, что вы после.

В основном это означает начало строки или пробел, затем символ @, за которым следуют 1 или более слов.

Например.

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

Дает тебе

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

Похожие вопросы