首页  >  问答  >  正文

将 *italic* 等字符串转换为 <i>italic</i>,但如果换行符位于星号限制范围内,则不进行转换

我的 PHP 代码中有以下正则表达式:

// markers for italic set *Text*
if (substr_count($line, '*')>=2)
{
    $line = preg_replace('#\*{1}(.*?)\*{1}#', '<i></i>', $line);
}

效果很好。

但是,当 $line 持有 <br> 时,例如

*This is my text<br>* Some other text

然后正则表达式仍然考虑文本并将其转换为:

<i>This is my text<br></i> Some other text

目标是如果遇到 <br> 则不翻译文本。如何使用正则表达式来做到这一点 - 使用所谓的“负向前瞻”或者如何更改现有的正则表达式?

注意:类似 *This is my text*<br>Some other text<br> 和再次 *italic*<br>END 的字符串仍应考虑和转换。

想法:或者我应该分解 $line 然后使用正则表达式迭代结果?!

P粉262073176P粉262073176227 天前368

全部回复(1)我来回复

  • P粉396248578

    P粉3962485782024-03-30 20:42:40

    使用匹配你不想要的内容并丢弃技术,您可以在 PHP (PCRE) 中使用此正则表达式:

    \*[^*]*
    \*(*SKIP)(*F)|\*([^*]*)\*

    并替换为$1

    正则表达式演示

    PHP 代码:

    $r = preg_replace('/\*[^*]*
    \*(*SKIP)(*F)|\*([^*]*)\*/'), "", $input);

    说明:

    • \*:匹配*
    • [^*]*:匹配 0 个或多个非 * 字符

    • :匹配
    • \*:匹配结束 *
    • (*SKIP)(*F):要丢弃并跳过此匹配的 PCRE 动词
    • <代码>|:或
    • \*([^*]*)\*:匹配 *s 括起来的字符串

    回复
    0
  • 取消回复