正则表达式替换周围的字符,同时保持字符串之间

时间:2016-07-19 16:50:49

标签: php regex string preg-replace preg-match

我正在使用PHP尝试将文本从一种Markdown转换为另一种风格。

例如,如果我有字符串**some text**,则应将其替换为字符串'''some text'''(每边的**都替换为'''&#39 ;三撇号)。但是,字符串**some other text不应该进行任何替换,因为它不以**

结尾

目前,我使用以下代码:

function convertBoldText($line){
    #Regex replace double asterisk IF if is FOLLOWED by a non-asterisk character
    $tmp = preg_replace('/\*{2}(?=[^\*])/', "'''", $line);
    #Regex replace double asterisk IF if is PRECEDED by a non-asterisk character
    return preg_replace('/(?<=[^\*])\*{2}/', "'''", $tmp);
  }

但是,这段代码也替换了以双星号开头但不以双星号结尾的字符串中的星号,不应该这样。

当且仅当双星号匹配时,如何使用正则表达式替换双星号(例如,打开和关闭双星号并且相互匹配)?如何使用正则表达式替换双星号?

最大的挑战来自前面提到的两个例子的情况,例如:

** these first asterisks should NOT be replaced **but these ones SHOULD**

1 个答案:

答案 0 :(得分:2)

您可以使用正则表达式匹配**后面跟**之后的任何文字,然后跟**

 function convertBoldText($line){
return preg_replace('/\*{2}(?!\s)((?:(?!\*{2}).)*)(?<!\s)\*{2}/s', "'''$1'''", $line);

}

请参阅IDEONE demo

正则表达式解释

  • \*{2} - 2 * s
  • (?!\s) - 两个星号后面没有空格
  • ((?:(?!\*{2}).)*) - 第1组捕获除**
  • 之外的任何文字
  • (?<!\s) - 之前不能有空格......
  • \*{2} - 两个* s
  • /s - 一个点也匹配任何字符和换行符。

更好的选择可以是

return preg_replace('/\*{2}(?!\s)([^*]*(?:\*(?!\*)[^*]*)*)(?<!\s)\*{2}/', "'''$1'''", $line);