подскажите пожалуйста как добавить айдишник юзера в тег 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);
ЗЫ. Вероятно можно проще, думать лень.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Возникает ошибка 500 (Internal Server Error) при отправке AJAX запроса, ошибка только при запросе на удаление из базы
Существуют ли плагин или другие подобные инструменты, которые позволили бы в постах заменить URL ссылок
Есть массив со ссылками на файлы с одинаковым именемКак переименовать default