Php替换*与<b>标签

时间:2018-04-10 06:11:36

标签: php regex preg-replace preg-replace-callback

我想在我的字符串中将*asd*替换为<b>asd</b>

*Abdāl* (*lit*: substitutes, but which can also mean generous [*karīm*]

在上面的字符串中,我想用*abdal*替换<b>abdal</b>以及用*括起来的其他字。

我该怎么做?

mycode的:

$s="*Abdāl* (*lit*: substitutes, but which can also mean generous [*karīm*]";
preg_replace_callback("#\*[^\*]*\*#",function ($string) { $string = preg_replace("/<a\s(.+?)>(.+?)<\/a>/is", "<b>$2</b>", $string); }, $s);

我能够将*abdal*字符串作为preg_replace_callback中的匹配项,但现在我正在尝试将*abdal*替换为<b>abdal</b>

2 个答案:

答案 0 :(得分:2)

您可以使用对preg_replace的简单调用,并使用带有捕获组的正则表达式,而不是使用星号内的值和带有占位符的字符串替换模式进行分组1:

$s = "*Abdāl* (*lit*: substitutes, but which can also mean generous [*karīm*]";
$s = preg_replace("#\*([^*]+)\*#", "<b>$1</b>", $s);
echo $s; // => <b>Abdāl</b> (<b>lit</b>: substitutes, but which can also mean generous [<b>karīm</b>]  

请参阅PHP demo

正则表达式为\*([^*]+)\*,它与*匹配,然后匹配并捕获到第1组*以外的任何一个或多个字符(带{{ 1}} - 请注意,[^*]+不必在角色类中进行转义,如果您还需要处理空的*对,请将**替换为您的+量词),然后匹配尾随*。替换模式包含*,它引用存储在组1中的文本。

请参阅regex demo

答案 1 :(得分:1)

$s="*Abdāl* (*lit*: substitutes, but which can also mean generous [*karīm*]";                                       
$s = preg_replace_callback("#\*[^\*]*\*#", function ($string) {
        $string = preg_replace("/\*([^*]+)\*/", "<b>$1</b>", $string);
        return $string[0];
       }, $s);

这对我有用。