Quando utilizzo substr($string,0,100)
, vengono assegnati i primi 100 caratteri. A volte ha lasciato l'ultima parola incompleta. Sembra strano. Posso limitarmi a parole piuttosto che char?Come acquisire parole complete usando substr() in PHP, parola per parola?
risposta
Se si contano solo le parole, la puntura risultante potrebbe essere ancora molto lunga poiché una singola "parola" potrebbe avere 30 caratteri o più. Suggerirei invece di troncare il testo a 100 caratteri, tranne se questo fa sì che una parola venga troncata, quindi è necessario rimuovere anche la parte troncata della parola. Questo è coperto da questa domanda correlata:
How to Truncate a string in PHP to the word closest to a certain number of characters?
Uso wordwrap
$your_desired_width = 100;
if (strlen($string) > $your_desired_width)
{
$string = wordwrap($string, 100);
$i = strpos($string, "\n");
if ($i) {
$string = substr($string, 0, $i);
}
}
Questo è un versioni modificate la risposta here. se il testo di input potrebbe essere molto lungo è possibile aggiungere questa riga prima della chiamata a capo automatico per evitare wordwrap dover analizzare l'intero testo:
$string = substr($string, 0, 101);
Uso di un'espressione regolare(Source)
$string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, 100));
Eviterei di utilizzare la funzione di wordwrap perché analizzerebbe inutilmente l'intera stringa. L'espressione regolare è il migliore dei due, IMO. – Matthew
@konforce: Sono d'accordo che la soluzione di espressione regolare sia semplice e flessibile ma alcune persone non si sentono a proprio agio con le espressioni regolari. Ho proposto una nuova versione della soluzione wordwrap. Va bene adesso? –
l'espressione regolare rimuoverà per errore l'ultima parola. Ho aggiunto il codice per includere un assegno. Vedi la modifica. –
I sarebbe fare qualcosa di simile:
<?php
function cut_text($text, $len)
{
for ($i = 0; $i < 10; ++$i)
{
$c = $text[$len + $i];
if ($c == ' ' || $c == "\t" || $c == "\r" || $c == "\n" || $c == '-')
break;
}
if ($i == 10) $i = 0;
return rtrim(substr($text, 0, $len + $i));
}
echo cut_text("Hello, World!", 3)."\n";
?>
solo iniziare ad un certo punto ($ len) e andare avanti un certo numero di carat ters ($ i) alla ricerca di un carattere di rottura (ad esempio, spazi bianchi). Puoi anche guardare indietro (- $ i) o in entrambe le direzioni, a seconda di cosa stai cercando.
$a = explode('|', wordwrap($string, 100, '|');
print $a[0];
Questo fallisce se il carattere | si verifica accidentalmente in $ stringa. Meglio usare chr (0) o qualcosa di simile che non si verificherà mai nella stringa $. – Peter
// Trim very long text to 120 characters. Add an ellipsis if the text is trimmed.
if(strlen($very_long_text) > 120) {
$matches = array();
preg_match("/^(.{1,120})[\s]/i", $very_long_text, $matches);
$trimmed_text = $matches[0]. '...';
}
Prova una singola linea di codice
$string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length));
Si tratta di una soluzione molto simile a quella di Scott Evernden, ma funziona anche se il carattere | accidentially si verifica nella stringa:
$result = explode(chr(0), wordwrap($longtext, $len, chr(0)))[0];
Ho provato questo semplice e ha funzionato per me
<?php echo substr($content, 0, strpos($content, ' ', 200)); ?>
Potrebbe spiegare più in dettaglio ciò che la tua definizione di una "parola" è? Stiamo parlando solo parole inglesi? Parole in qualsiasi lingua? Qualunque sequenza di lettere, che si tratti di una parola reale o no? E i numeri? Punteggiatura? Altri simboli? E '<<<<<<<<' una parola? ecc ... –
Il testo di input può contenere caratteri di nuova riga? –
Prova questo collegamento, può aiutarti http://stackoverflow.com/a/26098951/3944217 – edCoder