我想制作一个 PHP 函数,使双星号之间的文本变为粗体,一个星号之间的文本变为斜体,(非常像 stackoverflow 上的编辑器)。
同样的规则适用,如果 * 和单词之间有空格,则不应渲染。
谁能帮帮我? 我尝试过,但我只走到了这一步,因为我不知道如何制作奇数星号“< b >”和偶数星号“< /b >”。
(如果没有空格,我无法输入它们,stackoverflow 会将之间的文本呈现为粗体......)
$thenewtext = str_replace("**", "<b>", "**Hello World** of PHP");
一个简单的正则表达式就可以解决问题:
$thenewtext = preg_replace('#\*{2}(.*?)\*{2}#', '<b>$1</b>', '**Hello World** of PHP');
让我们展示输入中的一些边缘情况。 在我的代码片段中,我将使用环视来确保星号不大于 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 ****
更新:经过进一步调查,我找到了这个新的解决方案。
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
如有任何其他疑问,请告诉我。
我不太熟悉它,但你需要一个正则表达式。查看 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;
这会产生:
不加粗 是加粗不再加粗