Eu tenho um trecho de código escrito em PHP que extrai um bloco de texto de um banco de dados e o envia para um widget em uma página da web. O bloco de texto original pode ser um artigo longo ou uma frase curta ou duas; mas para esse widget não posso exibir mais do que, digamos, 200 caracteres. Eu poderia usar substr () para cortar o texto em 200 caracteres, mas o resultado seria cortado no meio das palavras - o que eu realmente quero é cortar o texto no final da última palavra antes de 200 caracteres.
183
s($str)->truncateSafely(200)
útil, conforme encontrado nesta biblioteca autônoma .Respostas:
Usando a função wordwrap . Ele divide os textos em várias linhas, de modo que a largura máxima seja a especificada, quebrando nos limites das palavras. Após a divisão, você simplesmente pega a primeira linha:
Uma coisa que este oneliner não trata é o caso em que o texto em si é menor que a largura desejada. Para lidar com esse caso extremo, deve-se fazer algo como:
A solução acima tem o problema de cortar prematuramente o texto se ele contiver uma nova linha antes do ponto de corte real. Aqui está uma versão que resolve esse problema:
Além disso, aqui está a classe de teste PHPUnit usada para testar a implementação:
EDIT:
Caracteres UTF8 especiais como 'à' não são manipulados. Adicione 'u' no final do REGEX para lidar com isso:
$parts = preg_split('/([\s\n\r]+)/u', $string, null, PREG_SPLIT_DELIM_CAPTURE);
fonte
\n
antes da largura desejada.Arabic
letras e seu reduzido a palavras corretas agora com ajuda datokenTruncate
função .. TNX a :) milhõesIsso retornará os primeiros 200 caracteres de palavras:
fonte
if (strlen($string) > $your_desired_width) { preg_replace(...); }
/\s+?(?:\S+)?$/
E aí está - um método confiável de truncar qualquer string para a palavra inteira mais próxima, mantendo o comprimento máximo da string.
Eu tentei os outros exemplos acima e eles não produziram os resultados desejados.
fonte
if
declaração:if (strlen($str) > 200) { ... }
$WidgetText = substr($string, 0, strpos($string, ' ', 200));
A seguinte solução nasceu quando notei um parâmetro $ break da função wordwrap :
Aqui está a solução :
Exemplo 1.
O exemplo acima exibirá:
Exemplo # 2.
O exemplo acima exibirá:
fonte
description
de um post)preg_replace('/\s+/', ' ', $description)
a substituir todos os espaços em branco com um único espaço;)Lembre-se sempre que estiver dividindo por "palavra" em qualquer lugar em que alguns idiomas, como chinês e japonês, não usem um caractere de espaço para dividir palavras. Além disso, um usuário mal-intencionado pode simplesmente inserir texto sem espaços, ou usar algum caractere semelhante ao Unicode para o caractere de espaço padrão; nesse caso, qualquer solução usada pode acabar exibindo o texto inteiro de qualquer maneira. Uma maneira de contornar isso pode ser verificar o comprimento da string depois de dividi-la em espaços normalmente; se a string ainda estiver acima de um limite anormal - talvez 225 caracteres neste caso -, vá em frente e divida-a de maneira tênue nesse limite.
Mais uma ressalva com coisas assim quando se trata de caracteres não ASCII; strings que os contêm podem ser interpretadas pelo padrão strlen () do PHP como sendo mais longo do que realmente são, porque um único caractere pode levar dois ou mais bytes em vez de apenas um. Se você apenas usar as funções strlen () / substr () para dividir strings, poderá dividir uma string no meio de um caractere! Em caso de dúvida, mb_strlen () / mb_substr () são um pouco mais infalíveis.
fonte
Use strpos e substr:
Isso fornecerá uma sequência truncada no primeiro espaço após 30 caracteres.
fonte
Aqui está:
fonte
Aqui está minha função com base na abordagem do @ Cd-MaN.
fonte
Descrição:
^
- começar do início da string([\s\S]{1,200})
- obtenha de 1 a 200 de qualquer personagem[\s]+?
- não inclua espaços no final do texto breve, para que possamos evitar emword ...
vez deword...
[\s\S]+
- corresponder a todo o outro conteúdoTestes:
regex101.com
vamos adicionar aor
alguns outrosr
regex101.com
orrrr
exatamente 200 caracteres.regex101.com
depois do quintor
orrrrr
excluído.Aproveitar.
fonte
$1
é um "substituto", mas neste contexto específico a que se refere? uma variável vazia?$1
referenciando para combinar parênteses([\s\S]{1,200})
.$2
fará referência a dois segundos par de colchetes, se houver algum padrão.É surpreendente como é complicado encontrar a solução perfeita para esse problema. Ainda não encontrei uma resposta nesta página que não falhe em pelo menos algumas situações (especialmente se a sequência contiver novas linhas ou tabulações, ou se a quebra de palavra for algo diferente de um espaço ou se a sequência tiver UTF- 8 caracteres multibyte).
Aqui está uma solução simples que funciona em todos os casos. Havia respostas semelhantes aqui, mas o modificador "s" é importante se você deseja que ele funcione com entrada de várias linhas, e o modificador "u" faz com que ele avalie corretamente os caracteres multibyte UTF-8.
Um caso de borda possível com isso ... se a sequência não tiver nenhum espaço em branco nos primeiros caracteres $ characterCount, ela retornará a sequência inteira. Se você preferir, isso força uma quebra em $ characterCount, mesmo que não seja um limite de palavras, você pode usar o seguinte:
Uma última opção, se você quiser, adicione reticências se truncar a string ...
fonte
Eu usaria a função preg_match para fazer isso, pois o que você deseja é uma expressão bastante simples.
A expressão significa "corresponder a qualquer substring, começando do início de comprimento de 1 a 200 que termina com um espaço". O resultado está em $ result e a correspondência está em $ correspondências. Isso cuida da sua pergunta original, que termina especificamente em qualquer espaço. Se você quiser terminar com novas linhas, altere a expressão regular para:
fonte
Ok, então eu tenho outra versão disso com base nas respostas acima, mas levando mais em conta (utf-8, \ ne & nbsp;), também uma linha que remove os códigos de acesso wordpress comentados se usados com o wp.
fonte
Esta é uma pequena correção para a resposta do mattmac:
A única diferença é adicionar um espaço no final de $ string. Isso garante que a última palavra não seja cortada conforme o comentário do ReX357.
Não tenho pontos de representação suficientes para adicionar isso como um comentário.
fonte
Uso:
Isso produzirá as primeiras 10 palavras.
A
preg_split
função é usada para dividir uma string em substrings. Os limites ao longo dos quais a cadeia deve ser dividida são especificados usando um padrão de expressões regulares.preg_split
A função usa 4 parâmetros, mas apenas os 3 primeiros são relevantes para nós no momento.Primeiro Parâmetro - Padrão O primeiro parâmetro é o padrão de expressões regulares ao longo do qual a string deve ser dividida. No nosso caso, queremos dividir a string entre os limites das palavras. Portanto, usamos uma classe de caracteres predefinida
\s
que corresponde aos caracteres de espaço em branco, como espaço, tabulação, retorno de carro e avanço de linha.Segundo Parâmetro - String de Entrada O segundo parâmetro é a string de texto longo que queremos dividir.
Terceiro parâmetro - limite O terceiro parâmetro especifica o número de substrings que devem ser retornados. Se você definir o limite como
n
, preg_split retornará uma matriz de n elementos. Os primeirosn-1
elementos conterão as substrings. O último(n th)
elemento conterá o restante da string.fonte
Com base no regex de @Justin Poliey:
fonte
Eu tenho uma função que faz quase o que você deseja; se você fizer algumas edições, ela se ajustará exatamente:
fonte
Foi assim que eu fiz:
fonte
Eu sei que isso é velho, mas ...
fonte
Crio uma função mais semelhante ao substr e usando a ideia do @Dave.
Ps .: O comprimento total do corte pode ser menor que o substr.
fonte
Adicionadas instruções IF / ELSEIF ao código de Dave e AmalMurali para lidar com seqüências de caracteres sem espaços
fonte
Acho que isso funciona:
função abbreviate_string_to_whole_word ($ string, $ max_length, $ buffer) {
}
O buffer permite ajustar o comprimento da string retornada.
fonte
Usa isto:
o código a seguir removerá ','. Se você tiver outro caractere ou sub-string, poderá usá-lo em vez de ','
// se você tiver outra conta de string para
fonte
Embora essa seja uma pergunta bastante antiga, achei que forneceria uma alternativa, pois ela não era mencionada e válida para o PHP 4.3 ou superior.
Você pode usar a
sprintf
família de funções para truncar o texto usando o%.ℕs
modificador de precisão.Truncamento simples https://3v4l.org/QJDJU
Resultado
Truncamento expandido https://3v4l.org/FCD21
Desde
sprintf
funções semelhantessubstr
e parcialmente cortam palavras. A abordagem abaixo garantirá que as palavras não sejam cortadas usandostrpos(wordwrap(..., '[break]'), '[break]')
um delimitador especial. Isso nos permite recuperar a posição e garantir que não correspondamos às estruturas de sentenças padrão.Retornando uma sequência sem cortar parcialmente as palavras e que não exceda a largura especificada, preservando as quebras de linha, se desejado.
Resultado
Resultados usando
wordwrap($string, $width)
oustrtok(wordwrap($string, $width), "\n")
fonte
Eu usei isso antes
fonte
Aqui você pode tentar isso
fonte
Eu acredito que esta é a maneira mais fácil de fazer isso:
Estou usando os caracteres especiais para dividir o texto e cortá-lo.
fonte
Pode ser que isso ajude alguém:
fonte