Как добавить id юзера в href тег a? php

94
29 марта 2022, 10:50

подскажите пожалуйста как добавить айдишник юзера в тег a?

//Получение id юзера 
$user = $this->userRepository->findUserByUsername($user); 
$userId = $user->getId(); 
 
//имеется вот такой preg_replace который находит нужный текст и оборачивает каждое найденное значение в тег а 
preg_replace($regex, '<a href="#">$1</a>', $sourceText) 
 
// изначальный текст 
$sourceText = text @user text text text @user2, @user3 text @user4 @user5!! text 
 
// Оборачивание найденного значения в тег a 
<a href="#">$1</a> 
 
// регулярка которая ищет нужные значения 
$regex = #(@\w+)# 
   

сейчас на выходе получается вот так

text <a href="#">@user</a> text text text <a href="#">@user2</a>, <a href="#">@user3</a> text <a href="#">@user4</a> <a href="#">@user5</a>!! text

необходимо чтобы было вот так

text <a href="site.com/prof/$userId">@user</a> text text text <a href="site.com/prof/$userId">@user2</a>, <a href="site.com/prof/$userId">@user3</a> text <a href="site.com/prof/$userId">@user4</a> <a href="site.com/prof/$userId">@user5</a>!! text

Answer 1

не до конца понял чего надо получить в итоге. смею предположить что надо заменить @user на ссылку.

$sourceText = "this is a @user link";
 $pattern = '/@(\S+)/i';
 $replace = '<a href="$1">$1</a>';
 echo preg_replace($pattern, $replace, $sourceText);
Answer 2
<?php
interface UserRepoInterface
{
  public function findUserByUsername($userName): ?User;
}
class User
{
  private $id;
  public function __construct($id)
  {
    $this->id = $id;
  }
  public function getId()
  {
    return $this->id;
  }
}
class UserRepoMock implements UserRepoInterface
{
  private $db;
  public function __construct()
  {
    $this->db = [
      'user'  => new User(1),
      'user2' => new User(2),
      'user3' => new User(3),
      'user4' => new User(4),
      'foo'   => new User(125),
    ];
  }
  public function findUserByUsername($userName): ?User
  {
    return $this->db[$userName] ?? null;
  }
}

class LinkGenerator
{
  private $userRepository;
  private $uri;
  public function __construct($uri, UserRepoInterface $userRepo)
  {
    $this->userRepository = $userRepo;
    $this->uri            = $uri;
  }
  public function generateFrom($sourceText, $regex, $replacement)
  {
    $matches      = [];
    $replacements = [];
    $needles      = [];
    $escape       = chr(1);
    // получаем список юзверей по паттерну
    preg_match_all($regex, $sourceText, $matches);
    // экранируем юзверей в исходной строке
    $sourceText = preg_replace($regex, implode([$escape, '$1', $escape]), $sourceText);
    foreach ($matches[0] as $match) {
      $user = $this->userRepository->findUserByUsername(substr($match, 1));;
      if ($user) {
        $userId         = $user->getId();
        // если нашли юзверя, формируем замену
        $replacements[] = str_replace(['#', '$1'], [$this->uri . $userId, $match], $replacement);
      } else {
        // если не нашли, кладем как есть
        $replacements[] = $match;
      }
      // будем искать экранированые имена, т.к. в замене имя тоже присутствует 
      $needles[] = implode([$escape, $match, $escape]);
    }
    return str_replace($needles, $replacements, $sourceText);
  }
}
$generator   = new LinkGenerator('site.com/prof/', new UserRepoMock());
$regex       = '#(@\w+)#';
$sourceText  = 'text @user text text text @user2, @user3 text @user4 @user5!! text @foo';
$replacement = '<a href="#">$1</a>';
echo $generator->generateFrom($sourceText, $regex, $replacement);

ЗЫ. Вероятно можно проще, думать лень.

READ ALSO
обращение к файлу

обращение к файлу

Следующий скрипт говорит что файл существует(а он существует)

103
Ошибка 500 при AJAX запросе

Ошибка 500 при AJAX запросе

Возникает ошибка 500 (Internal Server Error) при отправке AJAX запроса, ошибка только при запросе на удаление из базы

179
Существуют ли плагин, который позволил бы в постах заменять URL ссылки?

Существуют ли плагин, который позволил бы в постах заменять URL ссылки?

Существуют ли плагин или другие подобные инструменты, которые позволили бы в постах заменить URL ссылок

67
Переименовать файлы по ссылке PHP

Переименовать файлы по ссылке PHP

Есть массив со ссылками на файлы с одинаковым именемКак переименовать default

107