Mình có đoạn php
<?php
$texst = "[url=https://vi.wikipedia.org/wiki/BBCode]BBCode[/url]
[table]
[tr]
[td][b]Dạng[/b][/td]
[td][b]Ví dụ động từ \"to write\"[/b][/td]
[/tr]
[tr]
[td]Đơn giản[/td]
[td]write[/td]
[/tr]
[tr]
[td]Thêm s/es[/td]
[td]writes[/td]
[/tr]
[tr]
[td]Quá khứ[/td]
[td]wrote[/td]
[/tr]
[tr]
[td]To + nguyên mẫu[/td]
[td]to write[/td]
[/tr]
[tr]
[td]V-ing[/td]
[td]writing[/td]
[/tr]
[tr]
[td]V-ed / V3[/td]
[td]written[/td]
[/tr]
[/table]";
echo preg_replace_callback(
"~\[table\](\n*?(?:\n*?\[trt\]\n*?(?:\n*?\[tdt\]\n*?(?:[\s\S]+)\n*?\[\/tdt\]\n*?)+\n*?\[\/trt\]\n*?)\n*?)?(\n*?(?:\n*?\[tr\]\n*?(?:\n*?\[td\]\n*?(?:[\s\S]+)\n*?\[\/td\]\n*?)+\n*?\[\/tr\]\n*?)+\n*?)\[\/table\]~s",
function($m) {
$find = array('~\[trt\]~s','~\[\/trt\]~s','~\[tdt\]~s','~\[\/tdt\]~s');
$replace = array('<tr>','</tr>','<td>','</td>');
$m[1] = preg_replace($find,$replace,$m[1]);
$find = array('~\[tr\]~s','~\[\/tr\]~s','~\[td\]~s','~\[\/td\]~s');
$m[2] = preg_replace($find,$replace,$m[2]);
return '<table class="table"><thead class="thead-light">'.$m[1].'</thead><tbody>'.$m[2].'</tbody></table>';
},
$texst);
?>
Nó in ra
[url=https://vi.wikipedia.org/wiki/BBCode]BBCode[/url]
[table]
[tr]
[td][b]Dạng[/b][/td]
[td][b]Ví dụ động từ "to write"[/b][/td]
[/tr]
[tr]
[td]Đơn giản[/td]
[td]write[/td]
[/tr]
[tr]
[td]Thêm s/es[/td]
[td]writes[/td]
[/tr]
[tr]
[td]Quá khứ[/td]
[td]wrote[/td]
[/tr]
[tr]
[td]To + nguyên mẫu[/td]
[td]to write[/td]
[/tr]
[tr]
[td]V-ing[/td]
[td]writing[/td]
[/tr]
[tr]
[td]V-ed / V3[/td]
[td]written[/td]
[/tr]
[/table]
Mình đã test phần regexr rồi và nó hoạt động tốt (mình test ở https://regexr.com/)
Và mình test php trên https://www.jdoodle.com/php-online-editor và trên web mình đều không hoạt động?
Đã tim ra cách giải quyết
Thay regex thành:
\[table\]([\n\s]*?(?:[\n\s]*?\[trt\][\n\s]*?(?:[\n\s]*?\[tdt\][\n\s]*?(?:[\s\S]+)[\n\s]*?\[\/tdt\][\n\s]*?)+[\n\s]*?\[\/trt\][\n\s]*?)?[\n\s]*?)([\n\s]?(?:[\n\s]*?\[tr\][\n\s]*?(?:[\n\s]*?\[td\][\n\s]*?(?:[\s\S]+)[\n\s]*?\[\/td\][\n\s]*?)+[\n\s]*?\[\/tr\][\n\s]*?)+[\n\s]*?)\[\/table\]