【问题标题】:Php replace * with <b> tagsphp用<b>标签替换*
【发布时间】:2018-09-19 15:40:34
【问题描述】:

我想将字符串中的*asd* 替换为&lt;b&gt;asd&lt;/b&gt;

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

在上面的字符串中,我想用&lt;b&gt;abdal&lt;/b&gt; 替换*abdal* 以及用* 括起来的其他单词。

我该怎么做?

我的代码:

$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);

我能够在 preg_replace_callback 中获得 *abdal* 字符串作为匹配项,但现在我试图将 *abdal* 替换为 &lt;b&gt;abdal&lt;/b&gt;

【问题讨论】:

  • 显示您尝试过的内容...
  • 一个天真的解决方案是从正则表达式 \*([^*]+)\* 开始,自己尝试一下 :)

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


【解决方案1】:

您可以使用对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组中(使用[^*]+ - 注意@987654329 @ 不必在字符类中转义,如果您还需要处理空的** 对,请将+ 替换为* 量词),然后匹配尾随*。替换模式包含引用存储在第 1 组中的文本的 $1

请参阅regex demo

【讨论】:

    【解决方案2】:
    $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);
    

    这对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多