Poprawiłem tablice oraz uwzględniłem same \n .Wygląda to obecnie tak:
function ParseBBCode(string $string): string
{
$patterns =
[
'/\[ol\][\s\S]+?\[\/ol\]/',
'/\[ul\][\s\S]+?\[\/ul\]/',
'/\[table\][\s\S]+?\[\/table\]/'
];
$patterns =
[
'/\[b\](.*?)\[\/b\]/',
'/\[i\](.*?)\[\/i\]/',
'/\[u\](.*?)\[\/u\]/',
'/\[s\](.*?)\[\/s\]/',
'/\[j\](.*?)\[\/j\]/',
'/\[size=([\d.]+)\](.*?)\[\/size\]/',
'/\[color=(([a-z]+)|(#[0-f]{6}?)|(rgb\(\d{1,3}?\,\d{1,3}?\,\d{1,3}?\)))\](.*?)\[\/color\]/',
'/\[center\](.*?)\[\/center\]/',
'/\[left\](.*?)\[\/left\]/',
'/\[right\](.*?)\[\/right\]/',
'/\[quote=(.*?)\](.*?)\[\/quote\]/',
'/\[quote\](.*?)\[\/quote\]/',
'/\[url=(.*?)\](.*?)\[\/url\]/',
'/\[img=(.*?) alt=(.*?)\]/',
'/\[youtube=(.*?)\]/',
'/\[li\](.*?)\[\/li\]/',
'/\[td\](.*?)\[\/td\]/',
'/\[ol\](.*?)\[\/ol\]/',
'/\[ul\](.*?)\[\/ul\]/',
'/\[table\](.*?)\[\/table\]/',
'/\[tr\](.*?)\[\/tr\]/',
'/\[th\](.*?)\[\/th\]/',
'/\[code\]/',
'/\[\/code\]/',
'/\r\n/',
'/\n/'
];
$replacements =
[
'<strong>$1</strong>',
'<em>$1</em>',
'<span style="text-decoration:underline;">$1</span>',
'<del>$1</del>',
'<span style="text-align:justify;text-justify:inter-word;">$1</span>',
'<span style="font-size:$1rem;">$2</span>',
'<span style="color:$1;">$5</span>',
'<div style="text-align:center;">$1</div>',
'<div style="text-align:left;">$1</div>',
'<div style="text-align:right;">$1</div>',
'<blockquote><strong>$1:</strong><br>$2</blockquote>',
'<blockquote>$1</blockquote>',
'<a href="$1">$2</a>',
'<img src="$1" alt="$2">',
'<iframe src="https://www.youtube-nocookie.com/embed/$1" allow="autoplay; encrypted-media" allowfullscreen></iframe>',
'<li>$1</li>',
'<td>$1</td>',
'<ol>$1</ol>',
'<ul>$1</ul>',
'<table>$1</table>',
'<tr>$1</tr>',
'<th>$1</th>',
'<code>',
'</code>',
'<br>',
'<br>'
];
}
Co do funkcji preg_replace() oraz preg_replace_callback() nie do końca się zgodzę. To prawda, że funkcje te mogą zwrócić inny typ danych, ale dzieje się tak tylko w przypadku błędu. Błąd może wystąpić tylko i wyłącznie w dwóch przypadkach:
1. zmienna przekazywana do tych funkcji jest innego typu niż array lub string,
2. pattern lub replacement są przekazane do funkcji z błędem.
Możliwość pojawienia się błędu numer 2 została wyeliminowana przez sprawdzenie wyniku wykonania kodu, natomiast możliwość pojawienia się błędu numer 1 została wyeliminowana przez wymuszenie w funkcji typu string dla parametru $string.
A więc jedyna możliwość pojawienia się FATAL ERROR pomijając przekroczenie pamięci czy czasu wykonywania to przekazanie do funkcji zmiennej innego typu niż string. Jeżeli "programista" nie sprawdza typów danych przed przekazywaniem ich do funkcji to raczej nie będzie to jedyny FATAL ERROR w jego programie.
Chyba że się mylę? I dodatkowo drugi raz proszę o podpowiedź, na co zwrócić uwagę przy filtrowaniu url dla obrazów.