Other BbCode Options Nested tags fix - Tùy chỉnh BbCode chỉnh sửa các tag lồng nhau

PVS

Super Moderator
Thành viên BQT
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:
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: [^\[\]]
Hai quy tắc phải được lặp đi lặp lại, điều này giải thích thế này: (rule1|rule2)+?
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:
  1. Một bắt đầu: \[(?:/)?[\w\d]+?
  2. Một kết thúc: (?P<closingBracket>\])
Cả hai đều làm việc cùng nhau, sự bắt đầu là khung mở bbcode NHƯNG vì chúng ta là bên trong các phân tích cú pháp của XenForo (*), chúng ta cần phải kết hợp cả tag mở và tag đóng, thậm chí nếu một tag đóng sẽ không bao giờ có các tùy chọn . Điều này 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.


Nguồn: xenforo.com​
 

Hướng dẫn sử dụng

XenForo 1 XenForo 2
Translate by PVS

Dịch vụ XenForo của VNXF

Mr. Tuấn

Mobile/Zalo: 0988 488 096

Telegram: bluekpro

Email: [email protected]

Nhà Tài Trợ

Mút Xốp Không Gian
pallet Thịnh Phát
Top Bottom