2013-03-18 1 views
6

Я создаю свой собственный форум и застрял в удалении нескольких цитат из ответов. Я попытаюсь объяснить это на примере.php удалить все, кроме последнего процитированного ответа в форуме

Предположим, мы получили первое сообщение с текстом Hello A.

Затем кто-то цитирует это, и мы получаем: [q]Hello A[/q] Hello you too в базе данных.

И если третий человек цитирует второй ответ, он выглядит более уродливым и будет чем-то вроде: [q] [q]Hello A[/q] Hello you too[/q] Hello both.

Что я хочу сделать, это удалить все, кроме последних цитируемых ответов, из цитируемого текста. Так что в этом случае на третьем ответе я хочу снять [q]Hello A[/q] внутри третьей цитаты.

Как заставить его работать без ограничений [q]?

Редактировать: Как заменить несколько [q] что-то [/ q] внутри основного [q], который является первым? ->[q] [q]A[/q] B[/q] -> becomes -> [q]B[/q] ИЛИ [q][q][q]A[/q]B[/q]C[/q] -> becomes -> [q]C[/q]

+0

[q] [q] -> [q] заменить двойным одиночным –

+0

и как насчет окончания [/ q]? Я думаю, мне нужна какая-то функция preg_replace, но я в этом плохой. – fshock

ответ

1

Если я правильно понял, то вы, вероятно, хотите что-то вроде этого:

$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); 

Извинения для любых ошибок, я не имею PHP интерпретатор удобный для тестирования с, и это было около 9 месяцев с тех пор, как я использовал его, поэтому я немного ржавый.

Фактически, что мы пытаемся сделать, мы сначала находим позицию в строке первого открывающего тега, и мы находим позицию последнего закрывающего тега. После того, как у нас есть эти позиции, мы можем использовать их в качестве смещений, чтобы начать поиск, чтобы найти второй открывающий тег и второй последний закрывающий тег. Как только мы узнаем их положения, мы затем используем substr_replace для замены всего текста в строке содержимого, начиная со второго открывающего тега, до второго последнего закрывающего тега с пустой строкой.

Так, чтобы проиллюстрировать, если мы имеем:

[д] [д] Inner 3 [д] Inner 2 [/ q] Inner 1 [/ q] Outer [/ q]

мы находим второй [д] тег, предпоследний [/ q] тег, и заменить их, и все между ними с пустой строкой и получить:

[д] Outer [/ q]

Является ли это то, что вы мы ищем?

+0

У вас смешанный Q и P в вашем коде, даже если я их скопировал, я все равно возвращаю то же содержимое. – fshock

+0

Извините, отредактирован для исправления. Первое, что нужно проверить, это то, что значения для позиций тега в строке верны. Если firstTag, secondTag, lastTag и secondLastTag указывают на правильные местоположения в строке, мы, по крайней мере, знаем, что этот бит в порядке. Вы можете проверить это первым? – Xefan

+0

Попробуйте выполнить код сейчас, strrpos, похоже, не работает, как задокументировано с отрицательными смещениями, плюс у меня не было этого совершенно правильно. Этот код, похоже, отлично работает на http://sandbox.onlinephpfunctions.com/ сейчас. – Xefan