2013-03-18 32 views
6

Tôi đang tạo diễn đàn của riêng mình và bị kẹt với việc xóa nhiều văn bản trích dẫn khỏi thư trả lời. Tôi sẽ cố gắng giải thích điều này với ví dụ.php xóa tất cả trừ câu trả lời được trích dẫn cuối cùng trong diễn đàn

Giả sử chúng tôi nhận được thông báo đầu tiên với văn bản Xin chào A.

Sau đó, ai đó trích dẫn điều này và chúng tôi nhận được: [q]Hello A[/q] Hello you too trong cơ sở dữ liệu.

Và nếu người thứ ba trích dẫn câu trả lời thứ hai, nó sẽ trở nên xấu xí hơn và sẽ giống như sau: [q] [q]Hello A[/q] Hello you too[/q] Hello both.

Điều tôi muốn làm là xóa tất cả trừ các câu trả lời được trích dẫn cuối cùng từ văn bản được trích dẫn. Vì vậy, trong trường hợp này là câu trả lời thứ ba, tôi muốn xóa [q]Hello A[/q] bên trong trích dẫn thứ 3.

Làm cách nào để nó hoạt động trên [q] không giới hạn?

chỉnh sửa: Cách thay thế nhiều [q] thứ gì đó [/ q] bên trong [q] chính là cái đầu tiên? ->[q] [q]A[/q] B[/q] -> becomes -> [q]B[/q] HOẶC [q][q][q]A[/q]B[/q]C[/q] -> becomes -> [q]C[/q]

+0

[q] [q] -> [q] thay thế gấp đôi bằng –

+0

và kết thúc [/ q]? Tôi nghĩ rằng tôi cần một số loại preg_replace chức năng, nhưng tôi xấu ở đó .. – fshock

Trả lời

1

Nếu tôi đã hiểu một cách chính xác, sau đó bạn có thể muốn một cái gì đó như thế này:

$firstTag = strpos($content, "[q]"); 
$lastTag = strrpos($content, "[/q]", 0); 

$secondTag = strpos($content, "[q]", $firstTag + strlen("[q]")); 
$secondLastTag = strrpos(substr($content, 0, $lastTag), "[/q]"); 

$content = substr_replace($content, "", $secondTag, $secondLastTag - $secondTag + strlen("[q]") + 1); 

Xin lỗi cho bất kỳ lỗi, tôi không có một thông dịch viên PHP tiện dụng để thử nghiệm với và nó khoảng 9 tháng kể từ khi tôi sử dụng nó vì vậy tôi là một chút gỉ.

Có hiệu quả những gì chúng tôi cố gắng thực hiện, trước tiên, chúng tôi tìm vị trí trong chuỗi của thẻ mở đầu tiên và chúng tôi tìm thấy vị trí của thẻ đóng cuối cùng. Khi chúng tôi có các vị trí này, chúng tôi có thể sử dụng chúng làm bù trừ để bắt đầu tìm kiếm của chúng tôi để tìm thẻ mở thứ hai và thẻ đóng thứ hai cuối cùng. Một khi chúng ta biết vị trí của chúng, sau đó chúng ta sử dụng substr_replace để thay thế tất cả văn bản trong chuỗi nội dung bắt đầu từ thẻ mở thứ hai, đến thẻ đóng cuối cùng thứ hai bằng một chuỗi trống.

Vì vậy, để minh họa, nếu chúng ta có:

[q] [q] Nội 3 [q] Nội 2 [/ q] Nội 1 [/ q] Outer [/ q]

chúng ta thấy thứ hai [q] tag, thứ hai cuối cùng [/ q] tag, và thay thế chúng và tất cả mọi thứ giữa chúng với một chuỗi trống và nhận được:

[q] Outer [/ q]

phải là những gì này bạn đang tìm kiếm?

+0

Bạn có hỗn hợp Q và P trong mã của bạn, ngay cả tho tôi thay thế những người, tôi vẫn trả về cùng một nội dung. – fshock

+0

Xin lỗi, đã chỉnh sửa để sửa. Điều đầu tiên cần kiểm tra là các giá trị cho vị trí thẻ trong chuỗi là chính xác. Nếu firstTag, secondTag, lastTag và secondLastTag trỏ đến đúng vị trí trong chuỗi thì chúng ta ít nhất biết bit này là không sao. Bạn có thể kiểm tra điều này trước không? – Xefan

+0

Hãy thử mã ngay bây giờ, strrpos dường như không được làm việc như tài liệu với offsets tiêu cực, cộng với tôi đã không có nó khá đúng anyway. Mã này dường như hoạt động tốt tại http://sandbox.onlinephpfunctions.com/ ngay bây giờ. – Xefan

Các vấn đề liên quan