подскажите пожалуйста как добавить айдишник юзера в тег 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
не до конца понял чего надо получить в итоге. смею предположить что надо заменить @user на ссылку.
$sourceText = "this is a @user link";
$pattern = '/@(\S+)/i';
$replace = '<a href="$1">$1</a>';
echo preg_replace($pattern, $replace, $sourceText);
<?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);
ЗЫ. Вероятно можно проще, думать лень.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Возникает ошибка 500 (Internal Server Error) при отправке AJAX запроса, ошибка только при запросе на удаление из базы
Существуют ли плагин или другие подобные инструменты, которые позволили бы в постах заменить URL ссылок
Есть массив со ссылками на файлы с одинаковым именемКак переименовать default