Я пытаюсь создать текстовое сообщение в стиле 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]*)~/
У меня вопрос, могу ли я сделать все это в одном регулярном выражении? И можно ли удалить спецсимволы при выводе?
Этого не следует делать в серверной части, поскольку на самом деле вы не хотите хранить HTML в базе данных. HTML может быть намного больше, чем Markdown. Кроме того, вы должны позволить своим пользователям редактировать их исходный контент, который находится в Markdown, верно? Подумай об этом.
@Victor Как вы думаете, вы можете столкнуться с проблемой? Я просто хочу получить изображение тремя разными способами. жирный, курсив и зачеркивание. Я больше ничего не хочу. также благодаря ответу Анубхавы был решен.
Я просто говорю, что это что-то вроде сохранения минифицированного JavaScript в вашем репозитории.






Я не знаю, можно ли сделать все это в одном регулярном выражении, но для вашего второго вопроса: "можно ли удалить специальные символы при выводе", вы можете сделать что-то вроде этого:
$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> для удара
Эта работа для меня. Я не знаю, зачем Аззо все в одном и том же регулярном выражении; но игнорируя это, это должен быть правильный подход, потому что вы можете использовать вложенные стили (в то время как текущий принятый ответ этого не делает)
Необходим только один вызов preg_replace(), потому что функция может получать массив в первом и втором аргументе.
Вы можете сделать то же самое с javascript здесь, используя одну функцию UDF для javascript stackoverflow.com/questions/65787617/…
Вы можете использовать один вызов 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>
Большое спасибо за ответ, дорогой. Но коды для меня немного сложны. Я не мог понять, как им пользоваться.
вы можете показать мне, как я могу использовать ваш ответ в моем function makeBoldText($orimessage){..... }, пожалуйста?
Уважаемый, вы можете проверить этот снимок экрана, я где-то делаю что-то не так? prnt.sc/lydkqc
Не могли бы вы ответить на мой вопрос, пожалуйста, если у вас есть время Уважаемый Анубхава? stackoverflow.com/questions/53906690/… мне очень нужна помощь
Уважаемый, ваш ответ работает, но чего-то не хватает. Например, если я написал упоминание, например, @husey_in, имя пользователя husey_ в вашем коде также работает для имен пользователей, он заменяет мне нравится @husey_<i>in</i>, он должен работать, когда _text_ между _ или ~ или *
ваш ответ должен работать до первой и последней буквы. Если я напишу _hi how are you_, он должен работать, но если я написал hi_bro_how_are_you, он не должен работать. То же самое и с другими персонажами *~
Уважаемый, я получил это сейчас Warning: preg_replace_callback(): Unknown modifier '(' от $orimessage);
Уважаемый, что вы думаете о комментарии @victor?
Мне не нужно включать его, просто хочу, чтобы курсив, полужирный шрифт и зачеркивание, другие мысли, не для моего проекта. Например, facebook делает это, когда вы пишете текст звездочкой, такой как *Hi stackoverflow*, тогда текст автоматически выделяется жирным шрифтом. Также WhatsApp делает это. Мне не нужна другая редактируемая функция. Поэтому я не хочу, чтобы пользователи делали что-либо, кроме этого.
так вы имеете в виду facebook и whatsapp, показывающие сохранение html из базы данных, например. <i>Stackoverflow</i>?
stackoverflow делает это тоже думаю или нет? Если нам нужен полужирный текст, мы пишем * перед текстом и после текста.
Уважаемый, вы знаете, что есть способ ответить через регулярное выражение jquery?
Дорогой, могу я задать тебе один маленький вопрос?
есть ли способ изменить URL-адрес website.com/username на username.website.com/ без создания поддомена. Я вижу, как это делает tumblr, но как они это сделали, я не знаю. Я просто думаю, может, мы сможем это сделать с помощью htaccess?
вот ссылка например: https://lovefirthlove.tumblr.com/. Когда вы регистрируете tumblr, ссылка на ваш профиль выглядит так: https://anubhava.tumblr.com/
Я думаю, что это делается через конфигурацию VirtualHost, а не из .htaccess, но я мало в этом разбираюсь.
как я могу это сделать, дорогая. Есть ли какой-нибудь учебник по этому поводу или не могли бы вы объяснить мне, пожалуйста?
Как я уже сказал, у меня мало знаний, так как я не администратор, вам нужно будет искать в сети.
Вы можете сделать то же самое с 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>
По сути, это просто уценка. Используйте какую-нибудь библиотеку, чтобы разобрать это. Это не так просто, как вы думаете. В противном случае вам нужно учитывать правила многие.