PHP 서브스크립트가 문자가 아닌 단어로 끝나는지 확인
나는 서브스트 함수를 사용하는 방법을 알고 있지만 이것은 단어 중간에 문자열을 끝낼 수 있습니다.저는 문자열이 단어의 끝으로 끝나기를 원합니다. 제가 이걸 어떻게 해야 합니까?정규 표현이 필요할까요?어떤 도움이든 대단히 감사합니다.
이것이 제가 지금까지 가지고 있는 것입니다.하위 문자열만...
echo substr("$body",0,260);
건배.
substr($body, 0, strpos($body, ' ', 260))
정규식으로 수행할 수 있으며, 문자열 시작부터 단어 경계까지 최대 260자입니다.
$line=$body;
if (preg_match('/^.{1,260}\b/s', $body, $match))
{
$line=$match[0];
}
또는 단어 랩 기능을 사용하여 $body를 줄로 나눈 다음 첫 번째 줄을 추출할 수 있습니다.
사용해 볼 수 있습니다.
$s = substr($string, 0, 261);
$result = substr($s, 0, strrpos($s, ' '));
다음과 같이 할 수 있습니다.260번째 문자의 첫 번째 공백을 찾아 자르기 표시로 사용합니다.
$pos = strpos($body, ' ', 260);
if ($pos !== false) {
echo substr($body, 0, $pos);
}
워드랩 및 폭발 후 첫 번째 배열 요소가 당신이 원하는 것입니다.$wr=wordwrap($text,20,':'); $strs=explode(":",$wr); $strs[0]
이 솔루션을 사용합니다.
$maxlength = 50;
substr($name, 0, ($spos = strpos($name, ' ', $lcount = count($name) > $maxlength ? $lcount : $maxlength)) ? $spos : $lcount );
또는 인라인:
substr($name, 0, ($spos = strpos($name, ' ', $lcount = count($name) > 50 ? $lcount : 50)) ? $spos : $lcount );
function substr_word($body,$maxlength){
if (strlen($body)<$maxlength) return $body;
$body = substr($body, 0, $maxlength);
$rpos = strrpos($body,' ');
if ($rpos>0) $body = substr($body, 0, $rpos);
return $body;
}
이건 어때요?
/**
* @param string $text
* @param int $limit
* @return string
*/
public function extractUncutPhrase($text, $limit)
{
$delimiters = [',',' '];
$marks = ['!','?','.'];
$phrase = substr($text, 0, $limit);
$nextSymbol = substr($text, $limit, 1);
// Equal to original
if ($phrase == $text) {
return $phrase;
}
// If ends with delimiter
if (in_array($nextSymbol, $delimiters)) {
return $phrase;
}
// If ends with mark
if (in_array($nextSymbol, $marks)) {
return $phrase.$nextSymbol;
}
$parts = explode(' ', $phrase);
array_pop($parts);
return implode(' ', $parts); // Additioanally you may add ' ...' here.
}
테스트:
public function testExtractUncutPhrase()
{
$stringUtils = new StringUtils();
$text = 'infant ton-gue could make of both names nothing';
$phrase = 'infant';
$this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 11));
$this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 12));
$text = 'infant tongue5';
$phrase = 'infant';
$this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 13));
$this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 11));
$this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 7));
}
public function testExtractUncutPhraseEndsWithDelimiter()
{
$stringUtils = new StringUtils();
$text = 'infant tongue ';
$phrase = 'infant tongue';
$this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 13));
$text = 'infant tongue,';
$phrase = 'infant tongue';
$this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 13));
}
public function testExtractUncutPhraseIsSentence()
{
$stringUtils = new StringUtils();
$text = 'infant tongue!';
$phrase = 'infant tongue!';
$this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 14));
$this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 100));
$text = 'infant tongue!';
$phrase = 'infant tongue!';
$this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 13));
$text = 'infant tongue.';
$phrase = 'infant tongue.';
$this->assertEquals($phrase, $stringUtils->extractUncutPhrase($text, 13));
}
$pos = strpos($body, $wordfind);
echo substr($body,0, (($pos)?$pos:260));
public function Strip_text($data, $size, $lastString = ""){
$data = strip_tags($data);
if(mb_strlen($data, 'utf-8') > $size){
$result = mb_substr($data,0,mb_strpos($data,' ',$size,'utf-8'),'utf-8');
if(mb_strlen($result, 'utf-8') <= 0){
$result = mb_substr($data,0,$size,'utf-8');
$result = mb_substr($result, 0, mb_strrpos($result, ' ','utf-8'),'utf-8');;
}
if(strlen($lastString) > 0) {
$result .= $lastString;
}
}else{
$result = $data;
}
return $result;
}
문자열을 함수 Strip_text("html 태그가 있거나 html 태그가 없는 긴 텍스트", 15) 그러면 이 함수는 html 태그가 없는 html 문자열에서 처음 15자를 반환합니다.문자열이 15자 미만이면 전체 문자열을 반환합니다. 그렇지 않으면 $lastString 매개 변수 문자열이 포함된 15자를 반환합니다.
예:
Strip_text("<p>vijayDhanasekaran</p>", 5)
결과: vijay
Strip_text("<h1>vijayDhanasekaran<h1>",5,"***....")
결과: vijay****...
이 기능을 사용해 보십시오.
<?php
/**
* trims text to a space then adds ellipses if desired
* @param string $input text to trim
* @param int $length in characters to trim to
* @param bool $ellipses if ellipses (...) are to be added
* @param bool $strip_html if html tags are to be stripped
* @param bool $strip_style if css style are to be stripped
* @return string
*/
function trim_text($input, $length, $ellipses = true, $strip_tag = true,$strip_style = true) {
//strip tags, if desired
if ($strip_tag) {
$input = strip_tags($input);
}
//strip tags, if desired
if ($strip_style) {
$input = preg_replace('/(<[^>]+) style=".*?"/i', '$1',$input);
}
if($length=='full')
{
$trimmed_text=$input;
}
else
{
//no need to trim, already shorter than trim length
if (strlen($input) <= $length) {
return $input;
}
//find last space within length
$last_space = strrpos(substr($input, 0, $length), ' ');
$trimmed_text = substr($input, 0, $last_space);
//add ellipses (...)
if ($ellipses) {
$trimmed_text .= '...';
}
}
return $trimmed_text;
}
?>
언급URL : https://stackoverflow.com/questions/1233290/making-sure-php-substr-finishes-on-a-word-not-a-character
'programing' 카테고리의 다른 글
리눅스에서 파이프는 어떻게 작동합니까? (0) | 2023.08.13 |
---|---|
Google의 설명에 따라 오류 메시지를 표시하도록 Android EditText 설계 (0) | 2023.08.13 |
이 SQL 쿼리는 어떻게 동일한 id_product로 결과를 반환합니까? (0) | 2023.08.13 |
VBA에 범위가 있는지 테스트합니다. (0) | 2023.08.13 |
VBA 배열의 첫 번째 요소 제거 (0) | 2023.08.13 |