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]+)
рабочий пример регулярного выражения:
PHP:
$text = preg_replace('/(?<!\S)#([0-9a-zA-Z]+)/', '<a href="/hashtag/">#</a>', $text);
Edit: И чтобы сделать выражение совместимым с другими языками (неанглийскими символами):
(?<!\S)#([0-9\p{L}]+)
пример:
чтобы поймать второй и третий хэштеги без первого, Вам нужно указать, что хэштег должен начинаться в начале строки или предшествовать одному из нескольких символов пробела следующим образом:
$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's tags like #tag1 #tag2#tag3
etc.