Sostituire il pregnenolone – Sostituisci la seconda occorrenza di una partita

Sono relativamente nuovo a php, e spero che qualcuno possa aiutarmi con una regex di sostituzione, o forse una sostituzione della partita non sono esattamente sicuro.

Voglio mettere in grassetto automaticamente la (seconda occorrenza di una partita) e poi fare la 4a comparsa di una partita in corsivo e poi la settima apparizione di una partita sottolineata.

Questo è fondamentalmente per scopi SEO nel contenuto.

Ho fatto alcune sostituzioni con: e stavo pensando che questo dovrebbe fare il trucco?

preg_replace( pattern, replacement, subject [, limit ]) 

Conosco già la parola che voglio usare

 'pattern' is also a word that is already defined like [word]. `replacement` 'This is a variable I am getting from a mysql db. 'subject' - The subject is text from a db. 

Diciamo che ho questo contenuto: questo spiega più o less quello che voglio fare.

Questo è un esempio del text che voglio sostituire. In questo text voglio fare il secondo occurance dell'esempio di parola <grassetto. Quindi voglio saltare la prossima volta che l'esempio si verifica nel text, e fare la quarta volta che la parola esempio appare in corsivo. Quindi voglio saltare la quinta volta che la parola esempio appare nel text, così come la sesta volta e infine voglio far apparire il settimo esempio di tempo nel text. In questo esempio ho usato un collegamento ipertestuale come esempio di sottolineatura poiché non vedo una function di sottolineatura nell'editor di text. La parola esempio può apparire più volte nel text, ma il mio unico requisito è quello di sottolineare una volta, rendere grassetto una volta e rendere corsivo una volta. Più tardi potrò fare alcune citazioni sulla parola "esempio" ma non è ancora la priorità.

È anche importnte che il codice non per tramite un errore se non ci sono alless 7 occorrenze della parola.

Come potrei fare questo, qualsiasi idea sarebbe apprezzata.

Potresti usare preg_split per dividere il text alle partite, applicare le modifiche e rimettere tutto insieme:

 $parts = preg_split('/(example)/', $str, 7, PREG_SPLIT_DELIM_CAPTURE); if (isset($parts[3])) $parts[3] = '<b>'.$parts[3].'</b>'; if (isset($parts[7])) $parts[7] = '<i>'.$parts[7].'</i>'; if (isset($parts[13])) $parts[13] = '<u>'.$parts[13].'</u>'; $str = implode('', $parts); 

La formula dell'indice per la partita i-th è index = i · 2 – 1.

L'espressione regolare stessa non può contare e le funzioni preg_ forniscono un piccolo aiuto. Hai bisogno di una soluzione alternativa. Se wheressi effettivamente cercare solo una parola, potresti voler utilizzare le funzioni string. Altrimenti prova:

 // just counting if (7 >= preg_match_all($pattern, $subject, $matches)) { $cb_num = 0; $subject = preg_replace_callback($pattern, "cb_ibu", $subject); } function cb_ibu($match) { global $cb_num; $match = $match[0]; switch (++$cb_num) { case 2: return "<b>$match</b>"; case 4: return "<i>$match</i>"; case 7: return "<u>$match</u>"; default: return $match; } } 

Il trucco è avere una richiamata che fa la contabilità. E qui è abbastanza facile aggiungere qualsiasi regola.

Questa è una domanda interessante. La mia implementazione sarebbe:

 function replace_exact($word, $tag, $string, $limit) { $tag1 = '<'.$tag.'>'; $tag2 = '</'.$tag.'>'; $string = str_replace($word, $tag1.$word.$tag2, $string, 1); if ($limit==1) return $string; return str_replace($tag1.$word.$tag2,$word,$string,$limit-1); } 

Usalo in questo modo:

 echo replace_exact('Example', 'b', $source_text, 2); echo replace_exact('Example', 'i', $source_text, 4); 

Non so quanto velocemente functionrà, ma sarà più veloce di preg_replace.