PHP преобразование обычного текста в хэштег ссылка

Я пытаюсь преобразовать сообщения пользователя (текст) в хэштег кликабельные ссылки, используя PHP.

из того что я нашел, хэштеги должны содержать только буквенно-цифровые символы.

$text = 'Testing#one #two #three.test';
$text = preg_replace('/#([0-9a-zA-Z]+)/i', '<a href="/hashtag/">#</a>', $text);

Он помещает ссылки на все (#один #два #три), но я думаю #one Не следует преобразовывать, потому что он находится рядом с другим буквенно-цифровым символом, как настроить reg-ex, чтобы исправить это ?

третий тоже в порядке, он соответствует только #три, что я думаю правильный.

3 ответов


вы можете изменить свое регулярное выражение на отрицательный lookbehind для символа без пробелов, например:

(?<!\S)#([0-9a-zA-Z]+)

рабочий пример регулярного выражения:

http://regex101.com/r/mR4jZ7

PHP:

$text = preg_replace('/(?<!\S)#([0-9a-zA-Z]+)/', '<a href="/hashtag/">#</a>', $text);

Edit: И чтобы сделать выражение совместимым с другими языками (неанглийскими символами):

(?<!\S)#([0-9\p{L}]+)

пример:

https://regex101.com/r/Pquem3/1


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

$text = 'Testing#one #two #three.test';
$text = preg_replace('/(^|\s+)#([0-9a-zA-Z]+)(\b|$)/', '<a href="/hashtag/">#</a>', $text);

на \b в третьей группе определяет границу слова,которая позволяет шаблону соответствовать #three, когда за ним сразу следует символ, не являющийся словом.

редактировать: ответ MElliott выше является более эффективным, для записи.


С uni-кодом, html закодированным безопасным и присоединенным regexp;~(?<!&)#([\pL\d]+)~u

здесь some&#39;s tags like #tag1 #tag2#tag3 etc.