【问题标题】:Make text between asterisks bold将星号之间的文本加粗
【发布时间】:2013-10-08 16:57:32
【问题描述】:

我想制作一个 PHP 函数,它可以使文本在双星号之间变为粗体,在一个星号之间变为斜体,(很像 stackoverflow 上的编辑器)

同样的规则适用,如果 * 和单词之间有空格,则不应呈现。

谁能帮帮我? 我试过了,但我只到了这一步,因为我不知道如何制作奇数星号“”和偶数星号“”。

(没有空格我无法输入它们,stackoverflow 会将它们之间的文本呈现为粗体.....)

$thenewtext = str_replace("**", "<b>", "**Hello World** of PHP");

【问题讨论】:

  • 正则表达式适用于这个简单的例子。但请考虑选择解析器。对 HTML 使用正则表达式 can drive some people to drink.
  • @John: OP 似乎是将纯文本 转换为 HTML,而不是解析 HTML,所以正则表达式应该没问题。

标签: php str-replace


【解决方案1】:

一个简单的正则表达式就可以解决问题:

$thenewtext = preg_replace('#\*{2}(.*?)\*{2}#', '<b>$1</b>', '**Hello World** of PHP');

【讨论】:

  • '#\*{2}([^*]*)\*{2}#' 会快一点。
  • 嗯...这不允许我有一个包含三个星号的粗体字符串。应该吗?
【解决方案2】:

让我们在输入中显示一些边缘情况。 在我的 sn-p 中,我将使用环视来确保星号不大于 2,并且在开始/结束双星号内不允许有空格。

对于应该如何处理这些边缘情况有一些主观解释,但我至少可以说这种模式试图取代已发布问题中要求的空格取消资格。

代码:(Demo)

$string = 'start ** not bold ** and **bold** not bold **bold *** still bold** not bold **** not bold ****';
// bad space------⬏
// completely valid triple asterisk should not break styling-⬏
// more than 2 consecutive asterisks should not trigger styling?----------------------⬏⬏

echo preg_replace('/(?<!\*)\*\*(?![\s*])(.*?)(?<![\s*])\*\*(?!\*)/', '<b>$1</b>', $string);

输出:

start ** not bold ** and <b>bold</b> not bold <b>bold *** still bold</b> not bold **** not bold ****

【讨论】:

    【解决方案3】:

    我不太熟悉它,但您需要一个正则表达式。查看preg_replace()

    我最近实现了一个服务器端文本突出显示系统来补充 jQuery UI 的 AutoComplete。

    我对你的想法的改编是这样的:

    $txt = 'not bold [BeginBold]Yes Bold[EndBold] not bold again';
    
    $newtxt = str_replace("[BeginBold]", "<b>", $txt);
    $newtxt = str_replace("[EndBold]", "</b>", $txt);
    echo $newtxt;
    

    这会产生:

    不加粗是加粗不再加粗

    【讨论】:

    • 双星号看起来更优雅……不仅写得少,而且可以无缝切换到markdown。
    • @JohannesGrandy 我的回答仅作为想法的起点,因为您可以实现 Markdown 中不容易提供的功能。如果您想使用 PHP 进行完整的降价转换,那么只需获取一些预先构建的内容,例如 parsedown.org
    猜你喜欢
    • 2022-01-09
    • 2012-04-27
    • 1970-01-01
    • 2017-05-24
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多