2013-03-18 10 views
6

Sto creando il mio forum e bloccato con la rimozione di più testo tra virgolette dalle risposte. Proverò a spiegare questo con l'esempio.php rimuove tutto ma l'ultima risposta citata nel forum

Diciamo che abbiamo ricevuto il primo messaggio con il testo Ciao A.

Quindi qualcuno cita questo e otteniamo: [q]Hello A[/q] Hello you too nel database.

E se la terza persona cita la seconda risposta, diventa più brutta e sarà qualcosa del tipo: [q] [q]Hello A[/q] Hello you too[/q] Hello both.

Quello che voglio fare è rimuovere tutte le risposte tranne quelle citate dal testo citato. Quindi in questo caso su terza risposta voglio togliere lo [q]Hello A[/q] all'interno della 3a citazione.

Come farlo funzionare su un numero illimitato [q]?

modifica: Come sostituire più [q] qualcosa [/ q] all'interno del principale [q] che è il primo? ->[q] [q]A[/q] B[/q] -> becomes -> [q]B[/q] O [q][q][q]A[/q]B[/q]C[/q] -> becomes -> [q]C[/q]

+0

[q] [q] -> [q] sostituire doppio con singolo –

+0

e per quanto riguarda la fine [/ q]? Penso di aver bisogno di un qualche tipo di funzione preg_replace, ma non sono bravo in questo .. – fshock

risposta

1

Se ho capito bene, allora probabilmente desidera qualcosa di simile:

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

Ci scusiamo per eventuali errori, non ho un interprete PHP a portata di mano per testare con ed è sono passati circa 9 mesi da quando l'ho usato quindi sono un po 'arrugginito.

In effetti, ciò che tentiamo di fare è trovare la posizione nella stringa del primo tag di apertura e trovare la posizione dell'ultimo tag di chiusura. Una volta che abbiamo queste posizioni, possiamo usarle come offset per iniziare le nostre ricerche per trovare il secondo tag di apertura e il secondo tag di chiusura. Una volta che conosciamo le posizioni di questi, usiamo substr_replace per sostituire tutto il testo nella stringa di contenuto a partire dal secondo tag di apertura, fino al penultimo tag di chiusura con una stringa vuota.

Quindi, per illustrare, se abbiamo:

[q] [q] interno 3 [q] interno 2 [/ q] interno 1 [/ q] esterno [/ q]

troviamo il secondo [q] tag, il penultimo [/ q] tag, e li e tutto sostituirlo tra di loro con una stringa vuota e ottenere:

[q] esterno [/ q]

e 'questo che cercavano?

+0

Hai mescolato Q e P nel tuo codice, anche se li ho sostituiti, restituisco sempre lo stesso contenuto. – fshock

+0

Siamo spiacenti, modificato per correggere. La prima cosa da verificare è che i valori per le posizioni dei tag nella stringa siano corretti. Se firstTag, secondTag, lastTag e secondLastTag puntano alle posizioni corrette nella stringa, allora sappiamo che questo bit è ok. Puoi controllare questo prima? – Xefan

+0

Prova ora il codice, non sembra che strrpos funzioni come documentato con offset negativi, in più non ho avuto abbastanza ragione comunque. Questo codice sembrava funzionare correttamente su http://sandbox.onlinephpfunctions.com/ ora. – Xefan

Problemi correlati