2016-07-19 165 views
1

之間我使用PHP,試圖從文本降價的一個味道轉換爲另一種味道。正則表達式替換字符周圍,同時保持串

例如,如果我有字符串**some text**,則應將其替換爲字符串'''some text'''(將每邊的**替換爲'''三撇號)。但是,字符串**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**

+0

爲什麼不更換這一點 - '**這些第一星號不應該被更換**'? – splash58

回答

2

您可以使用正則表達式匹配**後跟用任何文本,但**和然後,接着用**

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

}

IDEONE demo

正則表達式的解釋

  • \*{2} - 2 *小號
  • (?!\s) - 第1組捕獲任何文本,但**
  • - 兩個星號
  • ((?:(?!\*{2}).)*)後不能有任何空白
  • (?<!\s) - 不能有任何空格前...
  • \*{2} - 兩個* s
  • /s - 點符合任何字符和換行符。

一個更好的選擇可能是

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

這對我來說很有效,老實說,答案比我想象的要簡單得多。謝謝!完美的作品。 –