Добрый день! Необходимо прокачать форму вывод записей на форму, таким образом что бы логины пользователей подсвечивались. То есть, например вот такая строка: "Добрый день @username, большое спасибо за Ваш ответ". Мне необходимо вырезать из всей это строки @username. Пробовал сделать просты костылем с помощью explode(). Вот так: PHP: $str = 'Добрый день @username, большое спасибо за Ваш ответ'; $new_str = explode( ',', explode('@', $str)[0] )[0]; echo '@'.$new_str Но во первых, как мне кажется, есть решение более правильное + такое решение все рано не полностью решает проблему. Например люди могут не ставить запятую посте @username, а просто оставлять пробел. Было бы круто, если бы explode() принимал регулярки в качество разделителя, тогда можно было бы ему сказать, мол "Обрезай либо по пробелу, либо по запятой", но увы... Пожалуйста, подскажите как правильно реализовать задуманное
PHP: echo preg_replace( '/@[a-Z0-9]{1,}/', '<strong>$1</strong>', 'Добрый день [USER=63779]@username[/USER], большое спасибо за Ваш ответ' ); приблизительно, мб ошибка
PHP: <?php echo preg_replace( '/[@[^\s]+\s]/', '<strong>$1</strong>', 'Добрый день @username, большое спасибо за Ваш ответ' ); ?>
@keren, во-первых, скобочки квадратные там, где нужны круглые; во-вторых, люди не только могут не ставить запятую, но и ставить знаки восклицательный, вопросительный и прочая, и даже оставлять @username в конце строки; в-третьих - запятая ведь тоже будет цепляться перед "пробельным" символом....
Да скобки я перепутал, а конец строки тоже должен работать: HTML: \s - Пробельный символ (пробел, табуляция, перевод строки и т. п.)
@keren, только конец строки - не есть её перевод и даже не возврат. Это просто конец строки. Вот вариант: /(@[\S]+?)(?=[\s,.!?:]|$)/
PHP: <?php # php version 7 error_reporting ( E_ALL ); echo preg_replace( '/(@[a-zа-я]{1,})/iu', '<strong>$1</strong>', 'Добрый день @username, большое @usernameспасибо- @ за Ваш ответ' ); HTML: Добрый день <strong>@username</strong>, большое <strong>@usernameспасибо</strong>- @ за Ваш ответ