PHP의 문자열을 특정 문자 수에 가장 가까운 단어로 잘라내는 방법은 무엇입니까?
PHP로 작성된 코드 조각이 데이터베이스에서 텍스트 블록을 가져와 웹 페이지의 위젯으로 보냅니다.원래 텍스트 블록은 긴 기사 또는 짧은 문장 또는 두 개일 수 있지만, 이 위젯의 경우 예를 들어 200자 이상 표시할 수 없습니다.subst()를 사용하여 200자로 텍스트를 잘라낼 수 있지만, 그 결과는 단어 중간에 끊어지는 것입니다.제가 정말 원하는 것은 마지막 단어의 끝에 있는 텍스트를 200자 전에 잘라내는 것입니다.
워드랩 기능을 사용하여.최대 너비가 지정한 너비가 되도록 텍스트를 여러 줄로 분할하여 단어 경계에서 구분합니다.분할 후에는 첫 번째 줄만 선택하면 됩니다.
substr($string, 0, strpos(wordwrap($string, $your_desired_width), "\n"));
이 oneliner는 텍스트 자체가 원하는 너비보다 짧은 경우에 대처하지 않습니다.이 엣지 케이스를 처리하려면 다음과 같은 작업을 수행해야 합니다.
if (strlen($string) > $your_desired_width)
{
$string = wordwrap($string, $your_desired_width);
$string = substr($string, 0, strpos($string, "\n"));
}
위의 솔루션에서는 실제 컷포인트 전에 새 선이 포함되어 있는 경우 텍스트를 너무 빨리 잘라내는 문제가 있습니다.이 문제를 해결하는 버전은 다음과 같습니다.
function tokenTruncate($string, $your_desired_width) {
$parts = preg_split('/([\s\n\r]+)/', $string, null, PREG_SPLIT_DELIM_CAPTURE);
$parts_count = count($parts);
$length = 0;
$last_part = 0;
for (; $last_part < $parts_count; ++$last_part) {
$length += strlen($parts[$last_part]);
if ($length > $your_desired_width) { break; }
}
return implode(array_slice($parts, 0, $last_part));
}
또한 구현 테스트에 사용되는 PHPUnit 테스트 클래스는 다음과 같습니다.
class TokenTruncateTest extends PHPUnit_Framework_TestCase {
public function testBasic() {
$this->assertEquals("1 3 5 7 9 ",
tokenTruncate("1 3 5 7 9 11 14", 10));
}
public function testEmptyString() {
$this->assertEquals("",
tokenTruncate("", 10));
}
public function testShortString() {
$this->assertEquals("1 3",
tokenTruncate("1 3", 10));
}
public function testStringTooLong() {
$this->assertEquals("",
tokenTruncate("toooooooooooolooooong", 10));
}
public function testContainingNewline() {
$this->assertEquals("1 3\n5 7 9 ",
tokenTruncate("1 3\n5 7 9 11 14", 10));
}
}
편집:
'a'와 같은 특수 UTF8 문자는 처리되지 않습니다.이를 처리하기 위해 REGEX 끝에 'u'를 추가합니다.
$parts = preg_split('/([\s\n\r]+)/u', $string, null, PREG_SPLIT_DELIM_CAPTURE);
그러면 단어의 처음 200자가 반환됩니다.
preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, 201));
$WidgetText = substr($string, 0, strrpos(substr($string, 0, 200), ' '));
여기에 문자열의 최대 길이를 유지하면서 문자열을 가장 가까운 전체 단어로 잘라내는 신뢰할 수 있는 방법이 있습니다.
위의 다른 예를 시도해 봤지만 원하는 결과를 얻지 못했습니다.
워드랩 함수의 $break 파라미터를 발견했을 때 다음과 같은 솔루션이 탄생했습니다.
string wordwrap ( string $str [, int $width = 75 [, string $break = "\n" [, bool $cut = false ] )
해결책은 다음과 같습니다.
/**
* Truncates the given string at the specified length.
*
* @param string $str The input string.
* @param int $width The number of chars at which the string will be truncated.
* @return string
*/
function truncate($str, $width) {
return strtok(wordwrap($str, $width, "...\n"), "\n");
}
예 #1
print truncate("This is very long string with many chars.", 25);
위의 예는 다음과 같습니다.
This is very long string...
예 2
print truncate("This is short string.", 25);
위의 예는 다음과 같습니다.
This is short string.
중국어나 일본어 등 일부 언어에서는 공백 문자를 사용하여 단어를 분할하지 않는다는 점에 유의하십시오.또한 악의적인 사용자는 공백 없이 텍스트를 입력하거나 표준 공백 문자와 유사한 Unicode를 사용할 수 있습니다. 이 경우 사용하는 솔루션은 텍스트 전체를 표시할 수 있습니다.이것을 회피하는 방법은, 통상의 스페이스 분할 후에 문자열의 길이를 체크하는 것입니다.그래서 문자열이 여전히 이상 제한(이 경우는 225 문자)을 넘는 경우는, 그 제한으로 어설프게 분할합니다.
비ASC의 경우 이와 같은 사항에 대해 하나 더 경고합니다.II 문자: 문자열은 PHP의 표준 strlen()에 의해 실제보다 긴 것으로 해석될 수 있습니다. 왜냐하면 하나의 문자가 1바이트가 아닌 2바이트 이상을 차지할 수 있기 때문입니다.strlen()/substr() 함수를 사용하여 문자열을 분할하는 경우 문자 중간에 문자열을 분할할 수 있습니다.의심스러운 경우에는 mb_stren()/mb_substr()이 조금 더 오류가 없습니다.
strpos 및 기판 사용:
<?php
$longString = "I have a code snippet written in PHP that pulls a block of text.";
$truncated = substr($longString,0,strpos($longString,' ',30));
echo $truncated;
그러면 첫 번째 공백에서 30자 뒤의 문자열이 잘립니다.
여기 있습니다.
function neat_trim($str, $n, $delim='…') {
$len = strlen($str);
if ($len > $n) {
preg_match('/(.{' . $n . '}.*?)\b/', $str, $matches);
return rtrim($matches[1]) . $delim;
}
else {
return $str;
}
}
@Cd-MaN의 어프로치에 근거한 기능.
function shorten($string, $width) {
if(strlen($string) > $width) {
$string = wordwrap($string, $width);
$string = substr($string, 0, strpos($string, "\n"));
}
return $string;
}
$shorttext = preg_replace('/^([\s\S]{1,200})[\s]+?[\s\S]+/', '$1', $fulltext);
설명:
^
- from string - start from string - string - start string -([\s\S]{1,200})
- 임에 1 200 - -에 。[\s]+?
글 않기 에 - 는 것을 수 .word ...
word...
[\s\S]+
콘텐츠와 - 일치하다
테스트:
regex101.com
에 추가합시다or
거의 없는r
regex101.com
orrrr
200엔regex101.com
다섯 번째 이후r
orrrrr
★★★★★★ 。
즐거운 시간 되세요.
이 문제에 대한 완벽한 해결책을 찾는 것이 얼마나 어려운지 놀랍다.이 페이지에서는 적어도 일부 상황에서 실패하지 않는 답을 찾을 수 없습니다(특히 문자열에 줄 바꿈이나 탭이 포함되어 있거나 단어 구분이 공백이 아닌 경우 또는 문자열에 UTF-8 멀티바이트 문자가 포함되어 있는 경우).
여기 모든 경우에 적용되는 간단한 솔루션이 있습니다.여기에서도 같은 답변이 있었습니다만, 복수행 입력에 대응하려면 , 「s」수식자가 중요합니다.또, 「u」수식자에 의해서 UTF-8 멀티바이트 문자를 올바르게 평가할 수 있습니다.
function wholeWordTruncate($s, $characterCount)
{
if (preg_match("/^.{1,$characterCount}\b/su", $s, $match)) return $match[0];
return $s;
}
이것과 관련된 하나의 가능한 가장자리 케이스는...문자열의 첫 번째 $characterCount 문자에 공백이 전혀 없는 경우 문자열 전체가 반환됩니다.단어 경계가 아니더라도 $characterCount에서 강제로 중단되도록 하려면 다음을 사용할 수 있습니다.
function wholeWordTruncate($s, $characterCount)
{
if (preg_match("/^.{1,$characterCount}\b/su", $s, $match)) return $match[0];
return mb_substr($return, 0, $characterCount);
}
마지막 옵션은 문자열이 잘릴 경우 줄임표를 추가하는 경우입니다.
function wholeWordTruncate($s, $characterCount, $addEllipsis = ' …')
{
$return = $s;
if (preg_match("/^.{1,$characterCount}\b/su", $s, $match))
$return = $match[0];
else
$return = mb_substr($return, 0, $characterCount);
if (strlen($s) > strlen($return)) $return .= $addEllipsis;
return $return;
}
다음은 mattmac의 답변에 대한 작은 수정입니다.
preg_replace('/\s+?(\S+)?$/', '', substr($string . ' ', 0, 201));
유일한 차이점은 $string 끝에 공간을 추가하는 것입니다.이것에 의해, ReX357의 코멘트에 따라서, 마지막 말이 끊어지지 않게 됩니다.
댓글로 추가할 수 있는 rep 포인트가 부족해요.
preg_match 함수를 사용하면 매우 간단한 표현입니다.
$matches = array();
$result = preg_match("/^(.{1,199})[\s]/i", $text, $matches);
이 표현은 "1 ~ 200 의 선두에서 공백으로 끝나는 임의의 서브스트링을 일치시킵니다"를 의미합니다.결과는 $result, 매치는 $matchs입니다.이렇게 하면 원래 질문이 해결됩니다. 즉, 어떤 공간에서도 구체적으로 끝납니다.줄바꿈으로 끝내려면 정규 표현을 다음과 같이 변경합니다.
$result = preg_match("/^(.{1,199})[\n]/i", $text, $matches);
네, 위의 답변에 따라 다른 버전을 얻었지만, 더 많은 것을 고려(utf-8, \n 및  )하고 wp와 함께 사용할 경우 코멘트된 워드프레스 쇼트 코드도 삭제했습니다.
function neatest_trim($content, $chars)
if (strlen($content) > $chars)
{
$content = str_replace(' ', ' ', $content);
$content = str_replace("\n", '', $content);
// use with wordpress
//$content = strip_tags(strip_shortcodes(trim($content)));
$content = strip_tags(trim($content));
$content = preg_replace('/\s+?(\S+)?$/', '', mb_substr($content, 0, $chars));
$content = trim($content) . '...';
return $content;
}
/*
Cut the string without breaking any words, UTF-8 aware
* param string $str The text string to split
* param integer $start The start position, defaults to 0
* param integer $words The number of words to extract, defaults to 15
*/
function wordCutString($str, $start = 0, $words = 15 ) {
$arr = preg_split("/[\s]+/", $str, $words+1);
$arr = array_slice($arr, $start, $words);
return join(' ', $arr);
}
사용방법:
$input = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna liqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.';
echo wordCutString($input, 0, 10);
처음 10개의 단어가 출력됩니다.
preg_split
함수를 사용하여 문자열을 하위 문자열로 분할합니다.문자열을 분할하는 경계가 정규 표현 패턴을 사용하여 지정됩니다.
preg_split
함수는 4개의 파라미터를 사용하지만, 현재 우리와 관련된 것은 처음 3개뿐입니다.
First Parameter – Pattern first – – pattern first 。이 경우 문자열을 단어 경계에 걸쳐 분할하려고 합니다. 미리 된 문자 합니다.\s
스페이스, 탭, 캐리지 리턴, 줄 바꿈 등의 공백 문자와 일치합니다.
[ Second Parameter ] : [ Input String ]두 번째 파라미터는 분할하는 긴 텍스트 문자열입니다.
세 번째 파라미터– Limit 세 번째 파라미터는 반환되는 서브스트링의 수를 지정합니다.을 음음음음으로 n
요소의 preg_display n은 n개의 요소로 됩니다. 번째 ★★★★★★★★★★★★★★.n-1
이치노 ★★★★(n th)
이치노
다음을 사용할 수 있습니다.
function word_shortener($text, $words=10, $sp='...'){
$all = explode(' ', $text);
$str = '';
$count = 1;
foreach($all as $key){
$str .= $key . ($count >= $words ? '' : ' ');
$count++;
if($count > $words){
break;
}
}
return $str . (count($all) <= $words ? '' : $sp);
}
예:
word_shortener("Hello world, this is a text", 3); // Hello world, this...
word_shortener("Hello world, this is a text", 3, ''); // Hello world, this
word_shortener("Hello world, this is a text", 3, '[read more]'); // Hello world, this[read more]
편집
구조:
1. 입력 텍스트에서 공간을 확장합니다.
$all = explode(' ', $text);
를 들어, 「」의 경우는, 「」입니다.$text
' world가 되고 'Hello world'가 $all
입니다.
["Hello", "world"]
2. 각 단어에 대해:
분해된 텍스트에서 각 요소 선택:
foreach($all as $key){...
단어를 합니다(「」).$key
부터 )까지$str
"CHANGE: "CHANGE: "CHANGE: " 。
$str .= $key . ($count >= $words ? '' : ' ');
1이 됩니다.$count
하세요.$words
의 루프를 끊습니다
if($count > $words){
break;
}
다음 ""를 반환하십시오.$str
구분자예: 구분자)$sp
보다 작은 입력 텍스트보다 작은 경우:
return $str . (count($all) <= $words ? '' : $sp);
@Justin Poliey의 regex를 기반으로 합니다.
// 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]. '...';
}
당신이 원하는 거의 모든 것을 할 수 있는 기능이 있습니다. 몇 가지 편집만 해주면 다음과 같은 기능이 딱 들어맞습니다.
<?php
function stripByWords($string,$length,$delimiter = '<br>') {
$words_array = explode(" ",$string);
$strlen = 0;
$return = '';
foreach($words_array as $word) {
$strlen += mb_strlen($word,'utf8');
$return .= $word." ";
if($strlen >= $length) {
$strlen = 0;
$return .= $delimiter;
}
}
return $return;
}
?>
난 이렇게 했어
$string = "I appreciate your service & idea to provide the branded toys at a fair rent price. This is really a wonderful to watch the kid not just playing with variety of toys but learning faster compare to the other kids who are not using the BooksandBeyond service. We wish you all the best";
print_r(substr($string, 0, strpos(wordwrap($string, 250), "\n")));
이것은 꽤 오래된 질문이지만, PHP 4.3+에 대해서는 언급되지 않았고 유효하기 때문에 대안을 제시해야겠다고 생각했습니다.
함수 패밀리를 사용하여 텍스트를 잘라낼 수 있습니다.%.ℕs
정밀도 수식어
마침표
.
다음에 이어지는 정수의 의미는 지정자에 따라 달라집니다.
- e, E, f 및 F 지정자의 경우: 소수점 뒤에 인쇄되는 자리수(기본값은 6)입니다.
- g 및 G 지정자의 경우: 인쇄되는 최대 유효 자리수입니다.
- 지정자의 경우: 문자열에 최대 문자 제한을 설정하는 컷오프 포인트로 기능합니다.
단순 잘라내기 https://3v4l.org/QJDJU
$string = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var_dump(sprintf('%.10s', $string));
결과
string(10) "0123456789"
확장 잘라내기 https://3v4l.org/FCD21
부터sprintf
와 같은 기능을 하다substr
말을 부분적으로 끊습니다.다음 접근방식은 다음을 사용하여 단어를 잘라내지 않도록 합니다.strpos(wordwrap(..., '[break]'), '[break]')
특별한 딜리미터를 사용합니다.이를 통해 위치를 검색하여 표준 문장 구조에서 일치하지 않도록 할 수 있습니다.
필요한 경우 줄 바꿈을 유지하면서 단어를 부분적으로 잘라내지 않고 지정된 너비를 초과하지 않는 문자열을 반환합니다.
function truncate($string, $width, $on = '[break]') {
if (strlen($string) > $width && false !== ($p = strpos(wordwrap($string, $width, $on), $on))) {
$string = sprintf('%.'. $p . 's', $string);
}
return $string;
}
var_dump(truncate('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', 20));
var_dump(truncate("Lorem Ipsum is simply dummy text of the printing and typesetting industry.", 20));
var_dump(truncate("Lorem Ipsum\nis simply dummy text of the printing and typesetting industry.", 20));
결과
/*
string(36) "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
string(14) "Lorem Ipsum is"
string(14) "Lorem Ipsum
is"
*/
사용 결과wordwrap($string, $width)
또는strtok(wordwrap($string, $width), "\n")
/*
string(14) "Lorem Ipsum is"
string(11) "Lorem Ipsum"
*/
오래된 건 알지만...
function _truncate($str, $limit) {
if(strlen($str) < $limit)
return $str;
$uid = uniqid();
return array_shift(explode($uid, wordwrap($str, $limit, $uid)));
}
@Dave라는 아이디어를 사용하여 기판과 비슷한 기능을 만듭니다.
function substr_full_word($str, $start, $end){
$pos_ini = ($start == 0) ? $start : stripos(substr($str, $start, $end), ' ') + $start;
if(strlen($str) > $end){ $pos_end = strrpos(substr($str, 0, ($end + 1)), ' '); } // IF STRING SIZE IS LESSER THAN END
if(empty($pos_end)){ $pos_end = $end; } // FALLBACK
return substr($str, $pos_ini, $pos_end);
}
추신: 전장절단은 기판보다 작을 수 있다.
공백 없이 문자열을 처리하기 위해 Dave 및 AmalMurali의 코드에 IF/ELSEIF 문을 추가했습니다.
if ((strpos($string, ' ') !== false) && (strlen($string) > 200)) {
$WidgetText = substr($string, 0, strrpos(substr($string, 0, 200), ' '));
}
elseif (strlen($string) > 200) {
$WidgetText = substr($string, 0, 200);
}
// a looonnng string ...
$str = "Le Lorem Ipsum est simplement du
faux texte employé dans la composition et
la mise en page avant impression.
Le Lorem Ipsum est le faux texte standard de
l'imprimerie depuis les années 1500, quand un
imprimeur anonyme assembla ensemble des morceaux
de texte pour réaliser un livre spécimen de polices
de texte. Il n'a pas fait que survivre cinq siècles,
mais s'est aussi adapté à la bureautique informatique,
sans que son contenu n'en soit modifié. Il a été
popularisé dans les années 1960 grâce à la vente
de feuilles Letraset contenant des passages du
Lorem Ipsum, et, plus récemment, par son inclusion
dans des applications de mise en page de texte,
comme Aldus PageMaker";
// number chars to cut
$number_to_cut = 300;
// string truncated in one line !
$truncated_string =
substr($str, 0, strrpos(substr($str, 0, $number_to_cut), ' '));
// test return
echo $truncated_string;
// variation (add ellipsis) : echo $truncated_string.' ...';
// output :
/* Le Lorem Ipsum est simplement du
faux texte employé dans la composition et
la mise en page avant impression.
Le Lorem Ipsum est le faux texte standard de
l'imprimerie depuis les années 1500, quand un
imprimeur anonyme assembla ensemble des morceaux
de texte pour réaliser un livre
*/
제가 본 바로는, 여기 있는 모든 솔루션은 출발점이 정해져 있는 경우에만 유효합니다.
이 설정을 전환할 수 있습니다.
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna liqua. Ut enim ad minim veniam.
이 경우:
Lorem ipsum dolor sit amet, consectetur...
특정 키워드 세트를 둘러싼 단어를 잘라내려면 어떻게 해야 합니까?
특정 키워드 세트를 둘러싼 텍스트를 잘라냅니다.
이를 변환하는 것이 목표입니다.
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna liqua. Ut enim ad minim veniam.
이 경우:
...consectetur adipisicing elit, sed do eiusmod tempor...
이는 검색 결과, 발췌 등을 표시할 때 매우 일반적인 상황입니다.이를 위해 다음 두 가지 방법을 조합하여 사용할 수 있습니다.
/**
* Return the index of the $haystack matching $needle,
* or NULL if there is no match.
*
* This function is case-insensitive
*
* @param string $needle
* @param array $haystack
* @return false|int
*/
function regexFindInArray(string $needle, array $haystack): ?int
{
for ($i = 0; $i < count($haystack); $i++) {
if (preg_match('/' . preg_quote($needle) . '/i', $haystack[$i]) === 1) {
return $i;
}
}
return null;
}
/**
* If the keyword is not present, it returns the maximum number of full
* words that the max number of characters provided by $maxLength allow,
* starting from the left.
*
* If the keyword is present, it adds words to both sides of the keyword
* keeping a balanace between the length of the suffix and the prefix.
*
* @param string $text
* @param string $keyword
* @param int $maxLength
* @param string $ellipsis
* @return string
*/
function truncateWordSurroundingsByLength(string $text, string $keyword,
int $maxLength, string $ellipsis): string
{
if (strlen($text) < $maxLength) {
return $text;
}
$pattern = '/' . '^(.*?)\s' .
'([^\s]*' . preg_quote($keyword) . '[^\s]*)' .
'\s(.*)$' . '/i';
preg_match($pattern, $text, $matches);
// break everything into words except the matching keywords,
// which can contain spaces
if (count($matches) == 4) {
$words = preg_split("/\s+/", $matches[1], -1, PREG_SPLIT_NO_EMPTY);
$words[] = $matches[2];
$words = array_merge($words,
preg_split("/\s+/", $matches[3], -1, PREG_SPLIT_NO_EMPTY));
} else {
$words = preg_split("/\s+/", $text, -1, PREG_SPLIT_NO_EMPTY);
}
// find the index of the matching word
$firstMatchingWordIndex = regexFindInArray($keyword, $words) ?? 0;
$length = false;
$prefixLength = $suffixLength = 0;
$prefixIndex = $firstMatchingWordIndex - 1;
$suffixIndex = $firstMatchingWordIndex + 1;
// Initialize the text with the matching word
$text = $words[$firstMatchingWordIndex];
while (($prefixIndex >= 0 or $suffixIndex <= count($words))
and strlen($text) < $maxLength and strlen($text) !== $length) {
$length = strlen($text);
if (isset($words[$prefixIndex])
and (strlen($text) + strlen($words[$prefixIndex]) <= $maxLength)
and ($prefixLength <= $suffixLength
or strlen($text) + strlen($words[$suffixIndex]) <= $maxLength)) {
$prefixLength += strlen($words[$prefixIndex]);
$text = $words[$prefixIndex] . ' ' . $text;
$prefixIndex--;
}
if (isset($words[$suffixIndex])
and (strlen($text) + strlen($words[$suffixIndex]) <= $maxLength)
and ($suffixLength <= $prefixLength
or strlen($text) + strlen($words[$prefixIndex]) <= $maxLength)) {
$suffixLength += strlen($words[$suffixIndex]);
$text = $text . ' ' . $words[$suffixIndex];
$suffixIndex++;
}
}
if ($prefixIndex > 0) {
$text = $ellipsis . ' ' . $text;
}
if ($suffixIndex < count($words)) {
$text = $text . ' ' . $ellipsis;
}
return $text;
}
다음 작업을 수행할 수 있습니다.
$text = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do' .
'iusmod tempor incididunt ut labore et dolore magna liqua. Ut enim' .
'ad minim veniam.';
$text = truncateWordSurroundingsByLength($text, 'elit', 25, '...');
var_dump($text); // string(32) "... adipisicing elit, sed do ..."
코드를 실행합니다.
효과가 있는 것 같습니다.
function abbreviate_string_to_whole_word($string, $max_length, $buffer) {
if (strlen($string) > $max_length) {
$string_cropped = substr($string, 0, $max_length - $buffer);
$last_space = strrpos($string_cropped, " ");
if ($last_space > 0) {
$string_cropped = substr($string_cropped, 0, $last_space);
}
$abbreviated_string = $string_cropped . " ...";
}
else {
$abbreviated_string = $string;
}
return $abbreviated_string;
}
버퍼를 사용하면 반환되는 문자열의 길이를 조정할 수 있습니다.
function trunc($phrase, $max_words) {
$phrase_array = explode(' ',$phrase);
if(count($phrase_array) > $max_words && $max_words > 0)
$phrase = implode(' ',array_slice($phrase_array, 0, $max_words)).'...';
return $phrase;
}
이거 예전에 썼는데
<?php
$your_desired_width = 200;
$string = $var->content;
if (strlen($string) > $your_desired_width) {
$string = wordwrap($string, $your_desired_width);
$string = substr($string, 0, strpos($string, "\n")) . " More...";
}
echo $string;
?>
저는 이것이 가장 쉬운 방법이라고 생각합니다.
$lines = explode('♦♣♠',wordwrap($string, $length, '♦♣♠'));
$newstring = $lines[0] . ' • • •';
특수 문자를 사용하여 텍스트를 분할하고 자르고 있습니다.
사용방법:
다음 코드는 ' , '를 삭제합니다.기타 문자 또는 서브스트링이 있는 경우 ' , 대신 사용할 수 있습니다.
substr($string, 0, strrpos(substr($string, 0, $comparingLength), ','))
// 다른 문자열 계정이 있는 경우
substr($string, 0, strrpos(substr($string, 0, $comparingLength-strlen($currentString)), ','))
이것이 다른 사람에게 도움이 될 수 있습니다.
<?php
$string = "Your line of text";
$spl = preg_match("/([, \.\d\-''\"\"_()]*\w+[, \.\d\-''\"\"_()]*){50}/", $string, $matches);
if (isset($matches[0])) {
$matches[0] .= "...";
echo "<br />" . $matches[0];
} else {
echo "<br />" . $string;
}
?>
언급URL : https://stackoverflow.com/questions/79960/how-to-truncate-a-string-in-php-to-the-word-closest-to-a-certain-number-of-chara
'programing' 카테고리의 다른 글
HTML5/Canvas/JavaScript를 사용하여 브라우저 내 스크린샷 촬영 (0) | 2023.01.30 |
---|---|
ExecJ에서 JavaScript 실행 시간을 찾을 수 없습니다. (0) | 2023.01.30 |
query_cache_size와 query_cache_limit의 차이점은 무엇입니까? (0) | 2023.01.30 |
네이티브 Windows 응용 프로그램의 리소스에 텍스트 파일 삽입 (0) | 2023.01.30 |
Laravel 테스트는 각 테스트 후에 트랜잭션을 롤백하지 않습니다. (0) | 2023.01.20 |