将星号之间的文本设为粗体

问题描述 投票:0回答:4

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

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

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

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

$thenewtext = str_replace("**", "<b>", "**Hello World** of PHP");
php str-replace
4个回答
22
投票

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

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

1
投票

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

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

代码:(演示

$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 ****

0
投票

更新:经过进一步调查,我找到了这个新的解决方案。

使用
preg_replace

在第一种方法中,preg_replace 函数用于搜索 $content 字符串中双引号之间的任何内容,并将其替换为标签中包含的相同内容。其工作原理如下:

<?php
function quote_filter($content)
{
    $content = preg_replace('/"([^"]*)"/', '<q>$1</q>', $content);
    return $content;
}

preg_replace
查找由正则表达式 /"([^"]*)"/ 定义的模式。

使用
preg_replace_callback

第二种方法使用 preg_replace_callback,它更灵活一些,并且允许对匹配的内容进行更复杂的处理。其工作原理如下:

<?php

function quote_filter($content)
{
    $content = preg_replace_callback('/"([^"]*)"/', function ($matches) {
        return '<q>' . $matches[1] . '</q>';
    }, $content);
    return $content;
}

preg_replace_callback
的工作方式与
preg_replace
类似,但它不是直接替换匹配项,而是允许您使用回调函数来处理匹配项。

如有任何其他疑问,请告诉我。


-1
投票

我不太熟悉它,但你需要一个正则表达式。查看 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;

这会产生:

不加粗 是加粗不再加粗

© www.soinside.com 2019 - 2024. All rights reserved.