kpodyganov
@kpodyganov
Увлекаюсь фронтенд-разработкой

Как заменить разные слова на ссылки с помощью preg_replace?

Написал код который может имена заменить на html ссылки в тексте, но при выводе оно почему-то пишет одни и те же имена. Например, что я хочу вывести: Welcome, @user. Welcome, @user2. А выводит: Welcome, @user2. Welcome, @user2.

<?php
$re = '/@[a-zA-Z0-9]+/m'; // Паттерн на замену
$str = 'Welcome, @user! Welcome, @user2!'; // Текст для замены имен пользователя

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

foreach ($matches as $a) {
    $content_for_replace = $a[0];
    $content_to_replace = '<a href="profile.php?user='$b'">'.$b.'</a>';

    $str = preg_replace($re, '<a href="">'.$a[0].'</a>', $a[0]);
}

echo $str;
?>


Я понимаю, что во время этого цикла он заменяет по паттерну все совпадения, но я не могу понять, как это исправить?
  • Вопрос задан
  • 235 просмотров
Решения вопроса 2
Melkij
@Melkij
PostgreSQL DBA
Смотрите в код и думайте, что ваш код выполняет на самом деле. Смотрите отладчиком содержимое переменных либо банально распечатайте их.

1) Вы сначала делаете match (не знаю зачем, ну да ладно, не о том вопрос).
2) Затем обходите результаты.
3) Затем игнорируете то что вы нашли и по всё той же регулярке что в пункте 1 заменяете всё в строке на певрое совпадение.

Результат совершенно логичен. Исправьте логику, чтобы заменять в теле цикла только одно соответствующее совпадение.

Через preg_replace это делать банально проще и удобнее, чем match + цикл по нему. А есть ещё preg_replace_callback если просто replace не хватает.
Ответ написан
TommyV888
@TommyV888 Куратор тега PHP
-
А зачем такие сложности с циклом? Можно сразу при помощи preg_replace сделать замену.
$str = 'Welcome, @user! Welcome, @user2!';
echo preg_replace('/@([a-z0-9]+)/i', '<a href="profile.php?user=$1" >@$1</a>', $str);

P.S. У вас в коде непонятно откуда берется переменная $b и в строке с ней пропущены точки для конкатенации строки
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы