2016-07-19 13 views
1

Ich verwende PHP, um zu versuchen, Text von einem Geschmack von Markdown in einen anderen Geschmack zu konvertieren.Regex ersetzen umgebende Zeichen, während die Zeichenfolge zwischen

Zum Beispiel, wenn ich die Zeichenfolge **some text** habe, sollte es durch die Zeichenfolge ersetzt werden '''some text''' (die ** auf jeder Seite wird ersetzt durch '' 'Triple Apostroph). Allerdings erfolgte die Zeichenfolge **some other text keinen Ersatz haben sollten, weil es nicht mit **

Derzeit endet, ich bin mit dem folgenden Code:

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

ABER, dieser Code auch die Sternchen in Strings ersetzt, dass Beginne aber nicht mit dem Doppelstern, was nicht sein sollte.

Wie benutze ich Regex, um doppelte Sternchen zu ersetzen, wenn und nur wenn die Doppelsternchen übereinstimmen (z. B. ein Doppelstern, der offen und geschlossen ist, und einander entsprechen)?

Die größte Herausforderung aus dem Fall kommt, wo Sie beide der zuvor genannten Beispiele haben kombiniert, wie:

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

+0

Warum dies nicht ersetzen - '** diese ersten Sterne sollten nicht ersetzt werden **'? – splash58

Antwort

2

Sie einen regulären Ausdruck verwenden ** übereinstimmen, die mit einem beliebigen Text folgt aber ** und dann folgte mit **:

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

}

Siehe die IDEONE demo

Regex Erklärung:

  • \*{2} - 2 * s
  • (?!\s) - Gruppe 1 erfassen jeden Text aber **
  • - es kann
  • ((?:(?!\*{2}).)*) kein Leerzeichen nach den zwei Sternchen sein
  • (?<!\s) - Es kann keine Leerzeichen vor ...
  • - zwei * s
  • /s - ein Punkt entspricht einem beliebigen Zeichen und einem Zeilenumbruch.

kann eine bessere Alternative

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

Das funktionierte für mich und war ehrlich gesagt eine viel einfachere Antwort als ich erwartet hatte. Vielen Dank! Funktioniert perfekt. –

Verwandte Themen