我的变量$content
包含我的文字。我想创建一个摘录$content
并显示第一个句子,如果句子短于15个字符,我想显示第二个句子。
我已经尝试从文件中删除前50个字符,它可以正常工作:
<?php echo substr($content, 0, 50); ?>
但我对结果不满意(我不希望任何词语被削减)。
是否有PHP函数获取整个单词/句子,而不仅仅是substr?
非常感谢!
答案 0 :(得分:12)
我想通了,但很简单:
<?php
$content = "My name is Luka. I live on the second floor. I live upstairs from you. Yes I think you've seen me before. ";
$dot = ".";
$position = stripos ($content, $dot); //find first dot position
if($position) { //if there's a dot in our soruce text do
$offset = $position + 1; //prepare offset
$position2 = stripos ($content, $dot, $offset); //find second dot using offset
$first_two = substr($content, 0, $position2); //put two first sentences under $first_two
echo $first_two . '.'; //add a dot
}
else { //if there are no dots
//do nothing
}
?>
答案 1 :(得分:8)
这是我写的一个快速帮助方法,用于获取给定正文文本的第一个N
个句子。它需要考虑句点,问号和感叹号,默认为2个句子。
function tease($body, $sentencesToDisplay = 2) {
$nakedBody = preg_replace('/\s+/',' ',strip_tags($body));
$sentences = preg_split('/(\.|\?|\!)(\s)/',$nakedBody);
if (count($sentences) <= $sentencesToDisplay)
return $nakedBody;
$stopAt = 0;
foreach ($sentences as $i => $sentence) {
$stopAt += strlen($sentence);
if ($i >= $sentencesToDisplay - 1)
break;
}
$stopAt += ($sentencesToDisplay * 2);
return trim(substr($nakedBody, 0, $stopAt));
}
答案 2 :(得分:6)
有一个单词 - wordwrap
示例代码:
<?php
for ($i = 10; $i < 26; $i++) {
$wrappedtext = wordwrap("Lorem ipsum dolor sit amet", $i, "\n");
echo substr($wrappedtext, 0, strpos($wrappedtext, "\n")) . "\n";
}
输出:
Lorem
Lorem ipsum
Lorem ipsum
Lorem ipsum
Lorem ipsum
Lorem ipsum
Lorem ipsum
Lorem ipsum dolor
Lorem ipsum dolor
Lorem ipsum dolor
Lorem ipsum dolor
Lorem ipsum dolor sit
Lorem ipsum dolor sit
Lorem ipsum dolor sit
Lorem ipsum dolor sit
Lorem ipsum dolor sit
答案 3 :(得分:4)
我在我们的一个网站上写了一个函数来做类似的事情。我确信可以通过调整来获得你的确切结果。
基本上,你给它一串文字和你希望修剪的单词数量。然后它会削减到那么多的单词。如果它找到的最后一个单词没有结束句子,它将继续超过你指定的单词数量,直到它到达句子的结尾。希望它有所帮助!
//This function intelligently trims a body of text to a certain
//number of words, but will not break a sentence.
function smart_trim($string, $truncation) {
$matches = preg_split("/\s+/", $string);
$count = count($matches);
if($count > $truncation) {
//Grab the last word; we need to determine if
//it is the end of the sentence or not
$last_word = strip_tags($matches[$truncation-1]);
$lw_count = strlen($last_word);
//The last word in our truncation has a sentence ender
if($last_word[$lw_count-1] == "." || $last_word[$lw_count-1] == "?" || $last_word[$lw_count-1] == "!") {
for($i=$truncation;$i<$count;$i++) {
unset($matches[$i]);
}
//The last word in our truncation doesn't have a sentence ender, find the next one
} else {
//Check each word following the last word until
//we determine a sentence's ending
for($i=($truncation);$i<$count;$i++) {
if($ending_found != TRUE) {
$len = strlen(strip_tags($matches[$i]));
if($matches[$i][$len-1] == "." || $matches[$i][$len-1] == "?" || $matches[$i][$len-1] == "!") {
//Test to see if the next word starts with a capital
if($matches[$i+1][0] == strtoupper($matches[$i+1][0])) {
$ending_found = TRUE;
}
}
} else {
unset($matches[$i]);
}
}
}
//Check to make sure we still have a closing <p> tag at the end
$body = implode(' ', $matches);
if(substr($body, -4) != "</p>") {
$body = $body."</p>";
}
return $body;
} else {
return $string;
}
}
答案 4 :(得分:3)
我知道这是一个老帖子,但我一直在寻找同样的东西。
preg_match('/^([^.!?]*[\.!?]+){0,2}/', strip_tags($text), $abstract);
echo $abstract[0];
答案 5 :(得分:2)
这将确保它永远不会返回半个字;
$short = substr($content, 0, 100);
$short = explode(' ', $short);
array_pop($short);
$short = implode(' ', $short);
print $short;
答案 6 :(得分:2)
对我来说,以下工作:
$sentences = 2;
echo implode('. ', array_slice(explode('.', $string), 0, $sentences)) . '.';
答案 7 :(得分:1)
这是我在网上找到的另一个功能;它会删除任何HTML,并首先清理一些时髦的MS角色;然后,它会在内容中添加一个可选的省略号字符,以表明它已被缩短。它正确分裂,所以你不会有看似随机的字符;
/**
* Function to ellipse-ify text to a specific length
*
* @param string $text The text to be ellipsified
* @param int $max The maximum number of characters (to the word) that should be allowed
* @param string $append The text to append to $text
* @return string The shortened text
* @author Brenley Dueck
* @link http://www.brenelz.com/blog/2008/12/14/creating-an-ellipsis-in-php/
*/
function ellipsis($text, $max=100, $append='…') {
if (strlen($text) <= $max) return $text;
$replacements = array(
'|<br /><br />|' => ' ',
'| |' => ' ',
'|’|' => '\'',
'|‘|' => '\'',
'|“|' => '"',
'|”|' => '"',
);
$patterns = array_keys($replacements);
$replacements = array_values($replacements);
$text = preg_replace($patterns, $replacements, $text); // convert double newlines to spaces
$text = strip_tags($text); // remove any html. we *only* want text
$out = substr($text, 0, $max);
if (strpos($text, ' ') === false) return $out.$append;
return preg_replace('/(\W)&(\W)/', '$1&$2', (preg_replace('/\W+$/', ' ', preg_replace('/\w+$/', '', $out)))) . $append;
}
输入:
<p class="body">The latest grocery news is that the Kroger Co. is testing a new self-checkout technology. My question is: What’s in it for me?</p>
<p>Kroger said the system, from Fujitsu,
输出:
The latest grocery news is that the Kroger Co. is testing a new self-checkout technology. My question is: What's in it for me? Kroger said the …
答案 8 :(得分:-3)
如果我是你,我会选择只选择第一句。
$t='Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vestibulum justo eu leo.'; //input text
$fp=explode('. ',$t); //first phrase
echo $fp[0].'.'; //note I added the final ponctuation
这很简单。