Как считать текст между одинаковыми символами и записать его в переменную

82
16 марта 2022, 23:20

По клике на кнопку в форму отправки сообщения вставляется ник пользователя которому адресовано это сообщение.
На выходе получается @Ник получателя@, дальше возможно какой то текст
Мне нужно получить/достать/считать Ник получателя между @@ и записать его в переменную, чтобы потом сравнить полученный ник с ником с сессии. Если совпадают, то заменить @@ на span с классом или стилем, а если не совпадают, то заменить, например, на курсив.
Гугл перекопал вдоль и поперек, но ничего подобного не нашел.
Ребят, помогите, пожалуйста, решит эту задачу.. Если это вообще возможно)

<?php if (!in_array($autor_nick, $us_status_ban)) : ?> // проверка автора на бан 
 
<?php if ($autor_role == 'admin') : ?> // по роли ставлю цвет ссылки и текста 
 
<a class="link answer_link" href="profile?id=<?= $autor_id; ?>" style="color: red;"><?= $autor_nick; ?></a><br> 
 
<p style="color: red;"><?= nl2br(showSmile($title, $pdo)); ?>// обработка текста сообщения (показ смайлов и переносы строк) 
 
</p> 
<?php elseif ($autor_role == 'moderator') : ?> 
<a class="link answer_link" href="profile?id=<?= $autor_id; ?>" style="color: green;"><?= $autor_nick; ?></a><br> 
<p style="color: green;"><?= nl2br(showSmile($title, $pdo)); ?></p> 
<?php else : ?> 
<a class="link answer_link" href="profile?id=<?= $autor_id; ?>"><?= $autor_nick; ?></a><br> 
<p><?= nl2br(showSmile($title, $pdo)); ?></p> 
<?php endif; ?> 
<?php else : ?> 
<span style="color: grey;">Автор временно не доступен - в бане <img src="/images/dirol.gif"></span> 
<p><?= nl2br(showSmile($title, $pdo)); ?></p> 
<?php endif; ?> 
 
<p> 
<?= $data; ?> 
</p> 
<?php if ($autor_nick != $us_ses_nick) : ?> 
<button id="answer_btn">Ответить</button> 
<?php endif; ?> 
 
 
// функция для обработки @Ник получателя@ 
function replace_nick ($msg, $user) { 
	preg_replace_callback('/^@([^@]*?)@/u', function($m) use ($user){ 
		$nickname = $m[1]; 
 
		if($nickname == $user) { 
			return "<span class='red'>{$nickname}</span>"; 
		}  
		return "<em>{$nickname}</em>"; 
	}, $msg); 
} 
 
 
// функция показа смайлов 
function showSmile ($str, $pdo) { 
	$stmt = $pdo->query("SELECT * FROM smiles ORDER BY id DESC"); 
	while ($result = $stmt->fetch()) { 
		$symbol[] = $result['title']; 
		$graphics[] = '<img src="' . $result['img'] . '">'; 
	} 
 
	return str_replace($symbol, $graphics, $str); 
} 
 
 
// в итоге если добавить функцию replace_nick до обработки  
// текста выше в коде, то получаю ошибки потому что функции 
// принимают разные параметры 
// если убрать функцию showSmile, а оставть replace_nick, 
// то тексты всех сообщений просто исчезают

Answer 1

что-то вроде такого

 $result = preg_replace("/^@([^@]*?)@/u", "<span>$1</span>", $msg);

чтобы просто заменить. Или для получения значения и дальнейшей логики, примерно так:

 preg_replace_callback(..., function($m) use ($user){
        $nickname = $m[1];
        if($nickname == $user) {
            return "<span class='red'>{$nickname}</span>";
        } 
        return "<em>{$nickname}</em>";
   }, $msg);
READ ALSO
Валидация диапазонов чисел Yii2

Валидация диапазонов чисел Yii2

Допустим, у меня в бд есть числовые поля value_from и value_toТам хранятся значение вида value_from 1, value_to 3 первая запись

89
Как записать имена загружаемых файлов в одну строку или столбец БД?

Как записать имена загружаемых файлов в одну строку или столбец БД?

При использовании обычной загрузки файла(без multiple), имя файла записывается в нужный столбец в БД, но при загрузке множества файлов(с multiple)...

69
laravel @error(&#39;name&#39;) {{$message}}

laravel @error('name') {{$message}}

Есть форма, в которой делаю валидацию данных:

81
Фильтр цен от минимального до максимального. laravel

Фильтр цен от минимального до максимального. laravel

Всем доброго дня! Не получается сделать фильтр от минимального до максимального значенияУ меня есть контроллер в котором я сравниваю цену...

83