- Tham gia
- 28/02/2015
- Bài viết
- 16,728
- Được Like
- 12,680
BbCode Options Nested tags fix - Tùy chỉnh BbCode chỉnh sửa các tag lồng nhau
Mô tả: Mã này sẽ cho phép sử dụng Bbcode bình thường trong một tùy chọn tag mở của một bbcode; ví dụ: [mybbcode=[b]title[/b]]content[/mybbcode]. Theo mặc định bbcode bên trong sẽ không được phân tích.
File: {yourForum}\library\XenForo\BbCode\parser.php
Function: protected function _parseTag()
Tìm:
Thay thế bằng (mã trên pastebin):
Giải thích để tham khảo:
Vì chúng ta bên trong các tùy chọn của tag mở, chúng ta không cần phải thực hiện một crazy regex phù hợp BbCodes lồng nhau với một pattern đệ quy.
Tất cả chúng ta cần đến là để nhắm mục tiêu các khung kết thúc "]" của một tag và thêm hai quy tắc lặp đi lặp lại để có được nó:
Global pattern này phải được đặt như là một lựa chọn, vì đó là lựa chọn của các tag bắt đầu: (?repeated rules)?
Để hoàn tất các lời giải thích, vẫn còn hai phần để giải thích:
Phần kết thúc là dễ hiểu, nó chỉ là một nhóm capturing với khung đóng, một trong đó đã được nhắm mục tiêu ngay từ đầu. Nhóm capturing này như được đặt tên là "closingBracket".
*Bộ phân tích XenForo là đọc các mã ký tự của ký tự và cần vị trí của khung đóng ... cả tag mở và tag đóng.
Chúc các bạn thành công.
Mô tả: Mã này sẽ cho phép sử dụng Bbcode bình thường trong một tùy chọn tag mở của một bbcode; ví dụ: [mybbcode=[b]title[/b]]content[/mybbcode]. Theo mặc định bbcode bên trong sẽ không được phân tích.
File: {yourForum}\library\XenForo\BbCode\parser.php
Function: protected function _parseTag()
Tìm:
PHP:
$tagContentEndPosition = strpos($this->_text, ']', $tagStartPosition);
Thay thế bằng (mã trên pastebin):
PHP:
//$tagContentEndPosition = strpos($this->_text, ']', $tagStartPosition);
//Modification starts: to revert back the code, uncomment the above line and delete this modification
$bbCodesOptionsPattern = '#\[(?:/)?[\w\d]+?(?:=(\[([\w\d]+?)(?:=.+?)?\].+?\[/\2\]|[^\[\]])+?)?(?P<closingBracket>\])#iu';
if(preg_match($bbCodesOptionsPattern, $this->_text, $matches, PREG_OFFSET_CAPTURE, $tagStartPosition) && isset($matches['closingBracket'][1]))
{
$tagContentEndPosition = $matches['closingBracket'][1];
}
else
{
$tagContentEndPosition = false;
}
//Modification ends
Giải thích để tham khảo:
Vì chúng ta bên trong các tùy chọn của tag mở, chúng ta không cần phải thực hiện một crazy regex phù hợp BbCodes lồng nhau với một pattern đệ quy.
Tất cả chúng ta cần đến là để nhắm mục tiêu các khung kết thúc "]" của một tag và thêm hai quy tắc lặp đi lặp lại để có được nó:
- là một trong những mô hình cơ bản của một bbcode: \[([\w\d]+?)(?:=.+?)?\].+?\[/\2\]
- là một để phù hợp với bất cứ điều gì khác, ngoại trừ một khung đóng: [^\[\]]
Global pattern này phải được đặt như là một lựa chọn, vì đó là lựa chọn của các tag bắt đầu: (?repeated rules)?
Để hoàn tất các lời giải thích, vẫn còn hai phần để giải thích:
- Một bắt đầu: \[(?:/)?[\w\d]+?
- Một kết thúc: (?P<closingBracket>\])
Phần kết thúc là dễ hiểu, nó chỉ là một nhóm capturing với khung đóng, một trong đó đã được nhắm mục tiêu ngay từ đầu. Nhóm capturing này như được đặt tên là "closingBracket".
*Bộ phân tích XenForo là đọc các mã ký tự của ký tự và cần vị trí của khung đóng ... cả tag mở và tag đóng.
Chúc các bạn thành công.
Nguồn: xenforo.com
Bài viết liên quan
Bài viết mới