2017-03-04 6 views
1
$regex = '/\[b\](.*?)\[\/b\]/is'; 

    $string = '[b][b][b]string[/b][/b][/b]'; 

Dies wird nur bis zum ersten [/ b] übereinstimmen, so dass, wenn ich diese Regex verwenden diese bbcode konvertieren in HTML Ich werde mit diesem Ende:Wiederholte Spiel innerhalb Spiel

string[/b][/b] 

I‘ m mit PHP preg_replace, wie kann ich nur mit string, also 3 HTML-Fett-Tags enden.

+0

Vielleicht '\ [b \ (\ /?)]' Mit '' <$1strong> dies nicht für abgestimmte Paarungen überprüft though .. Das wäre das gleiche wie 'str_replace (array ('[b]', '[/ b]'), array ('', '')' – chris85

+0

Können Sie nicht asymmetrischen Ersatz ('\ [(\/|) b \] 'zu' <$1b> ')? – horcrux

+1

Sie können wiederholt ersetzen, bis nichts mehr übereinstimmt. – apokryfos

Antwort

3

Für solche schmutzigen Fälle:

this [b]is [b]a[/b][/b] test [b]string[/b] 

Eine rekursive Lösung funktioniert:

\[b](?:(?:(?!\[b]).)*?|(?R))*\[/b] 

Live demo

PHP-Code:

$str = 'this [b]is [b]a[/b][/b] test [b]string[/b]'; 

echo preg_replace_callback('~\[(\w+)](?:(?:(?!\[\1]).)*?|(?R))*\[/(\1)]~', function($m) { 
    return "**".preg_replace("~\[/?$m[1]]~", '', $m[0])."**"; 
}, $str); 

Ausgänge:

this **is a** test **string** 
+0

Wenn Sie in der Live-Demo von regex101 auf pcre flavor klicken, wird wegen des letzten Schrägstrichs 'pattern error' angezeigt. kann durch Backslash behoben werden. Vielen Dank. – MohaMad

+0

Ich bin sicher, du hast die mir zur Verfügung gestellte Live-Demo in meiner Antwort nicht genau angeschaut. (Es ist bereits auf PCRE Geschmack) @MohaMad – revo

+0

Ich weiß, es ist regex101 Bug! versuchen Sie es mit pcre oder ändern Sie es in Javascript und zurück zu pcre, bitte @revo – MohaMad

1

Sie können eine nicht-Capture-Gruppe verwenden, um die Anzahl der Wiederholungen zu verlängern:

(?:\[b\])+(.*?)(?:\[\/b\])+ 
^^^  ^^  ^^^  ^^ 

Siehe demo

+0

Gibt es einen Weg, könnte es mit Strings wie folgt funktionieren: [b] [b] [b] string [/ b] string [/ b] string [/ b] – Vixxs

+0

@revo Ich bin mir nicht sicher, ob BBCode solche Kollisionen bieten könnte, oder? –

+0

@Vixxs Welches Ergebnis haben Sie für eine solche Eingabe? –