我在页面上有一个带有UTF8编码的textarea。
如何用php计算所有句子?
更新 句子以大写字母开头,以点,问号或感叹号结束。
答案 0 :(得分:3)
正如没有人说的那样,这取决于你如何定义句子。是一个吗?这是一个线路?这是资本吗? 我认为定义“一个句子”真的很难,因为对于每个定义,你都可以想到该规则的100个例外。
无论如何,如果你想出一个定义,你就可以计算出你的textarea中出现的定义。如换行数,点数或大写字母数。或者将所有这些组合成一个定义。所以基本上,只需要获取textarea的内容并处理其中的一些功能。 : - )
对于这个问题,这是最好的回答。
修改修改后,我的回答是:
function starts_with_upper($str) {
$chr = mb_substr ($str, 0, 1, "UTF-8");
return mb_strtolower($chr, "UTF-8") != $chr;
}
//Get sentences splitted by a dot and starting with a capital letter.
$total = 0;
$sentences = explode('.', rtrim($text, '.'));
for ($i = 0; $i < count($sentences); $i++) {
$sentence = $sentences[i];
if (starts_with_upper($sentence)) {
$total++;
}
}
echo "You have " . $total . " sentences ending in a dot.
答案 1 :(得分:3)
从PHP的角度来看,<textarea>
只是另一个<input>
,因此在提交表单时,$_GET
或$_POST
可以正常使用.
。
句子计数本身非常复杂 - 您可以根据文本中的句点数(e.g.
)计算句子数量,但这会因缩写而失败,例如: sentences = characters/70
。你可以通过计算一个空格后跟一个大写字母然后用一个大写字母来计算,但是对于缩写而不是普通名词,以及在句子开始时不使用大写字母的人来说,这将是失败的。您可以决定平均句子长度(比方说70个字符)和近似<?php
preg_match_all("/(^|[.!?])\s*[A-Z]/",$_POST['textarea'],$matches);
$count = count($matches);
。这些解决方案都不是完美的(在我看来甚至是好的)。
更新:根据您更新的问题,以下内容应该会有所帮助:
{{1}}
答案 2 :(得分:1)
如果您将句子视为最后带点的单词,则可以计算文本中的点数。
如果您使用新行,请计算\n
。