regex PHP 8.1 preg_replace仅在两个UBB标记之外-正则表达式可能错误

k5ifujac  于 2022-11-18  发布在  PHP
关注(0)|答案(1)|浏览(104)

我需要用HTML标记<br>替换换行符\n\r,但仅限于[code] UBB标记之外。
示例字符串,如何存储在DB中:

$string = "Test 123
Line break
[code]5: Test
10: With line
15: breaks[/code]
Further writing
Another new line";

使用以下代码:

$bbextended = array(
"/\[code\](.*?)\[\/code\](*SKIP)(*FAIL)|\\r?\\n/i" => "<br>",
"/\[code\](.*?)\[\/code\]/i" => "<textarea>$1</textarea>",
);
foreach($bbextended as $match=>$replacement){
$string = preg_replace($match, $replacement, $string);
}
echo $string;

最后得到以下HTML输出:

Line break<br>Test123<br>[code]5: Test<br>10: With line<br>15: breaks[/code]<br>Further writing<br>Another new line

这意味着[code][/code] UBB标记中的换行符被替换为<br>(错误,不应该),代码元素没有被替换为<textarea></textarea>(也是错误的)。
预期的HTML输出为:

Line break<br>Test123<br><textarea>5: Test
10: With line
15: breaks
</textarea><br>Further writing<br>Another new line

我试着用regex 101自己解决它,但是它突出了不应该突出的东西.. x1c 0d1x
我假设有一个问题是由实际的换行符和regex如何搜索引起的。

ss2ws0br

ss2ws0br1#

"/[code[\w\W]*?code](*SKIP)(*FAIL)|\\r?\\n/i" => "<br>",
这看起来是可行的--检测多行代码标记的开始和结束,并跳过它们

相关问题