Замените пары символов в тексте чата тегами html, чтобы они были выделены полужирным шрифтом, курсивом и зачеркиванием

Я пытаюсь создать текстовое сообщение в стиле WhatsApp. Когда пользователь создает такой текст:

*Hi* ~how are you~ _where are you?_

тогда этот текст автоматически меняется вот так

Привет как дела где ты

Я знаю, что могу сделать это с помощью регулярного выражения php следующим образом:

Пример для полужирного текста:

function makeBoldText($orimessage){
    $message = $orimessage;
    $regex = "/\*([\w]*)\*/";
    $message = preg_replace($regex, '<strong>$0</strong>', $message);
    return  $message ;
}
echo makeBoldText($message);

Но есть проблема: нужно удалить * при выводе текста.

Другое регулярное выражение также должно быть таким:

Смелый:

/\*([\w]*)\*/ 

Курсив:

/_([\w]*)_/ 

зачеркивание:

 /~([\w]*)~/

У меня вопрос, могу ли я сделать все это в одном регулярном выражении? И можно ли удалить спецсимволы при выводе?

По сути, это просто уценка. Используйте какую-нибудь библиотеку, чтобы разобрать это. Это не так просто, как вы думаете. В противном случае вам нужно учитывать правила многие.

M. Eriksson 22.12.2018 13:00

Этого не следует делать в серверной части, поскольку на самом деле вы не хотите хранить HTML в базе данных. HTML может быть намного больше, чем Markdown. Кроме того, вы должны позволить своим пользователям редактировать их исходный контент, который находится в Markdown, верно? Подумай об этом.

Victor 24.12.2018 13:41

@Victor Как вы думаете, вы можете столкнуться с проблемой? Я просто хочу получить изображение тремя разными способами. жирный, курсив и зачеркивание. Я больше ничего не хочу. также благодаря ответу Анубхавы был решен.

Azzo 24.12.2018 15:11

Я просто говорю, что это что-то вроде сохранения минифицированного JavaScript в вашем репозитории.

Victor 24.12.2018 18:52
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
1 687
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я не знаю, можно ли сделать все это в одном регулярном выражении, но для вашего второго вопроса: "можно ли удалить специальные символы при выводе", вы можете сделать что-то вроде этого:

$subject = "*Hi* ~how are you~ _where are you?_";
$message = preg_replace('/(?:\*)([^*]*)(?:\*)/', '<strong>$1</strong>', $subject);
$message = preg_replace('/(?:_)([^_]*)(?:_)/', '<i>$1</i>', $message);
$message = preg_replace('/(?:~)([^~]*)(?:~)/', '<strike>$1</strike>', $message);

Как прокомментировал Эми, вы можете использовать <b> для полужирного шрифта, <i> для курсива и <s> для удара

Эта работа для меня. Я не знаю, зачем Аззо все в одном и том же регулярном выражении; но игнорируя это, это должен быть правильный подход, потому что вы можете использовать вложенные стили (в то время как текущий принятый ответ этого не делает)

cfrostte 23.03.2020 16:55

Необходим только один вызов preg_replace(), потому что функция может получать массив в первом и втором аргументе.

mickmackusa 19.01.2021 22:22

Вы можете сделать то же самое с javascript здесь, используя одну функцию UDF для javascript stackoverflow.com/questions/65787617/…

Hiren Raiyani 23.01.2021 13:30
Ответ принят как подходящий

Вы можете использовать один вызов preg_replace_callback здесь:

$styles = array ( '*' => 'strong', '_' => 'i', '~' => 'strike');

function makeBoldText($orimessage) {
   global $styles;
   return preg_replace_callback('/(?<!\w)([*~_])(.+?)\1(?!\w)/',
      function($m) use($styles) { 
         return '<'. $styles[$m[1]]. '>'. $m[2]. '</'. $styles[$m[1]]. '>';
      },
      $orimessage);
}

// call it as:
$s = '*Hi* ~how are you~ _where are you?_';
echo makeBoldText($s);
//=> <strong>Hi</strong> <strike>how are you</strike> <i>where are you?</i>

Большое спасибо за ответ, дорогой. Но коды для меня немного сложны. Я не мог понять, как им пользоваться.

Azzo 22.12.2018 18:02

вы можете показать мне, как я могу использовать ваш ответ в моем function makeBoldText($orimessage){..... }, пожалуйста?

Azzo 22.12.2018 18:07

Уважаемый, вы можете проверить этот снимок экрана, я где-то делаю что-то не так? prnt.sc/lydkqc

Azzo 22.12.2018 19:12

Не могли бы вы ответить на мой вопрос, пожалуйста, если у вас есть время Уважаемый Анубхава? stackoverflow.com/questions/53906690/… мне очень нужна помощь

Azzo 24.12.2018 09:24

Уважаемый, ваш ответ работает, но чего-то не хватает. Например, если я написал упоминание, например, @husey_in, имя пользователя husey_ в вашем коде также работает для имен пользователей, он заменяет мне нравится @husey_<i>in</i>, он должен работать, когда _text_ между _ или ~ или *

Azzo 24.12.2018 13:25

ваш ответ должен работать до первой и последней буквы. Если я напишу _hi how are you_, он должен работать, но если я написал hi_bro_how_are_you, он не должен работать. То же самое и с другими персонажами *~

Azzo 24.12.2018 13:30

Уважаемый, я получил это сейчас Warning: preg_replace_callback(): Unknown modifier '(' от $orimessage);

Azzo 24.12.2018 15:49

Уважаемый, что вы думаете о комментарии @victor?

Azzo 24.12.2018 16:16

Мне не нужно включать его, просто хочу, чтобы курсив, полужирный шрифт и зачеркивание, другие мысли, не для моего проекта. Например, facebook делает это, когда вы пишете текст звездочкой, такой как *Hi stackoverflow*, тогда текст автоматически выделяется жирным шрифтом. Также WhatsApp делает это. Мне не нужна другая редактируемая функция. Поэтому я не хочу, чтобы пользователи делали что-либо, кроме этого.

Azzo 24.12.2018 16:25

так вы имеете в виду facebook и whatsapp, показывающие сохранение html из базы данных, например. <i>Stackoverflow</i>?

Azzo 24.12.2018 16:28

stackoverflow делает это тоже думаю или нет? Если нам нужен полужирный текст, мы пишем * перед текстом и после текста.

Azzo 24.12.2018 16:32

Уважаемый, вы знаете, что есть способ ответить через регулярное выражение jquery?

Azzo 26.12.2018 09:14

Дорогой, могу я задать тебе один маленький вопрос?

Azzo 31.12.2018 21:36

есть ли способ изменить URL-адрес website.com/username на username.website.com/ без создания поддомена. Я вижу, как это делает tumblr, но как они это сделали, я не знаю. Я просто думаю, может, мы сможем это сделать с помощью htaccess?

Azzo 31.12.2018 21:42

вот ссылка например: https://lovefirthlove.tumblr.com/. Когда вы регистрируете tumblr, ссылка на ваш профиль выглядит так: https://anubhava.tumblr.com/

Azzo 01.01.2019 17:57

Я думаю, что это делается через конфигурацию VirtualHost, а не из .htaccess, но я мало в этом разбираюсь.

anubhava 02.01.2019 07:47

как я могу это сделать, дорогая. Есть ли какой-нибудь учебник по этому поводу или не могли бы вы объяснить мне, пожалуйста?

Azzo 02.01.2019 07:49

Как я уже сказал, у меня мало знаний, так как я не администратор, вам нужно будет искать в сети.

anubhava 02.01.2019 07:51

Вы можете сделать то же самое с javascript здесь, используя одну UDF-функцию javascript

Используйте эту функцию для переноса текста с помощью регулярного выражения (regex).

function wrap(str) {
  if (str) {
    return str
      .replace(/(?:\*)([^*]*)(?:\*)/gm, "<strong>$1</strong>")
      .replace(/(?:_)([^_]*)(?:_)/gm, "<i>$1</i>")
      .replace(/(?:~)([^~]*)(?:~)/gm, "<strike>$1</strike>")
      .replace(/(?:```)([^```]*)(?:```)/gm, "<tt>$1</tt>");
  } else {
    return str;
  }
}
let str = "Hello *Hiren Raiyani*, This is testing text which has _italic_ text and ~Strick Text~ also, and ``` monospace text also exists ```"; 

let htmlStr = wrap(str);
console.info(htmlStr);

document.getElementById("str-wrp").innerHTML = htmlStr;
<div id = "str-wrp"></div>

Пример:

let str = "Hello *Hiren Raiyani*, This is testing text which has _italic_ text and ~Strick Text~ also, and ``` monospace text also exists ```;

wrap(str);

Вывод:

Hello <strong>Hiren</strong>, This is testing text which has <i>italic</i> text and <strick>Strick Text</strick> also, and <tt> monospace text also exists <tt>

Хотя этот вопрос касается PHP, это эквивалент JavaScript. Также многим людям нужен идеальный код, отвечающий их потребностям. Если вы не хотите, чтобы стиль охватывал новую строку, а также при использовании ([^*<\n]+) убедитесь, что хотя бы один символ находится между стилями, иначе ** без промежуточного символа станет невидимым.

function format_text(text){
return text.replace(/(?:\*)([^*<\n]+)(?:\*)/g, "<strong>$1</strong>")
     .replace(/(?:_)([^_<\n]+)(?:_)/g, "<i>$1</i>")
      .replace(/(?:~)([^~<\n]+)(?:~)/g, "<s>$1</s>")
      .replace(/(?:```)([^```<\n]+)(?:```)/g, "<tt>$1</tt>")
}

• Обратной стороной приведенного выше кода является то, что вы не можете вкладывать стили, например, *_Bold and italic_*.

Чтобы разрешить вложенные стили, используйте это ?

format_text(text){
return text.replace(/(?:\*)(?:(?!\s))((?:(?!\*|\n).)+)(?:\*)/g,'<b>$1</b>')
   .replace(/(?:_)(?:(?!\s))((?:(?!\n|_).)+)(?:_)/g,'<i>$1</i>')
   .replace(/(?:~)(?:(?!\s))((?:(?!\n|~).)+)(?:~)/g,'<s>$1</s>')
   .replace(/(?:--)(?:(?!\s))((?:(?!\n|--).)+)(?:--)/g,'<u>$1</u>')
   .replace(/(?:```)(?:(?!\s))((?:(?!\n|```).)+)(?:```)/g,'<tt>$1</tt>');

// extra:
// --For underlined text--
// ```Monospace font```
}

? Если вы хотите, чтобы ваш стиль охватил новую строку, удалите \n из регулярного выражения. Также, если ваша новая строка является тегом разрыва HTML, вы можете заменить \n на <br>

Другие вопросы по теме