За последние 24 часа нас посетили 59880 программистов и 1771 робот. Сейчас ищут 818 программистов ...

Обрезать строку от символа до символа

Тема в разделе "PHP для новичков", создана пользователем smartCreate, 15 янв 2018.

  1. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    Добрый день! Необходимо прокачать форму вывод записей на форму, таким образом что бы логины пользователей подсвечивались. То есть, например вот такая строка: "Добрый день @username, большое спасибо за Ваш ответ". Мне необходимо вырезать из всей это строки @username.

    Пробовал сделать просты костылем с помощью explode(). Вот так:

    PHP:
    1. $str = 'Добрый день @username, большое спасибо за Ваш ответ';
    2.  
    3. $new_str = explode( ',', explode('@', $str)[0] )[0];
    4.  
    5. echo '@'.$new_str
    Но во первых, как мне кажется, есть решение более правильное + такое решение все рано не полностью решает проблему. Например люди могут не ставить запятую посте @username, а просто оставлять пробел. Было бы круто, если бы explode() принимал регулярки в качество разделителя, тогда можно было бы ему сказать, мол "Обрезай либо по пробелу, либо по запятой", но увы...

    Пожалуйста, подскажите как правильно реализовать задуманное
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    PHP:
    1. echo preg_replace( '/@[a-Z0-9]{1,}/', '<strong>$1</strong>', 'Добрый день [USER=63779]@username[/USER], большое спасибо за Ваш ответ' );
    приблизительно, мб ошибка
     
  3. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
  4. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    PHP:
    1. <?php
    2. echo preg_replace( '/[@[^\s]+\s]/', '<strong>$1</strong>',
    3. 'Добрый день @username, большое спасибо за Ваш ответ' );
    4. ?>
     
  5. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @keren, во-первых, скобочки квадратные там, где нужны круглые;
    во-вторых, люди не только могут не ставить запятую, но и ставить знаки восклицательный, вопросительный и прочая, и даже оставлять @username в конце строки;
    в-третьих - запятая ведь тоже будет цепляться перед "пробельным" символом....
     
    keren нравится это.
  6. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Да скобки я перепутал, а конец строки тоже должен работать:
    HTML:
    1. \s - Пробельный символ (пробел, табуляция, перевод строки и т. п.)
     
    #6 keren, 16 янв 2018
    Последнее редактирование: 16 янв 2018
  7. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @keren, только конец строки - не есть её перевод и даже не возврат. Это просто конец строки.
    Вот вариант: /(@[\S]+?)(?=[\s,.!?:]|$)/
     
    keren нравится это.
  8. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    PHP:
    1. <?php # php version 7
    2.  
    3. error_reporting ( E_ALL );
    4.  
    5. echo preg_replace( '/(@[a-zа-я]{1,})/iu', '<strong>$1</strong>', 'Добрый день @username, большое @usernameспасибо- @ за Ваш ответ' );
    HTML:
    1.  
    2. Добрый день <strong>@username</strong>, большое <strong>@usernameспасибо</strong>- @ за Ваш ответ
    3.  
     
    keren нравится это.