1

我从 php.net 获得了这个函数,用于将句子中的大写字母转换为小写字母。

function sentence_case($string) {
    $sentences = preg_split('/([.?!]+)/', $string, -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
    $new_string = '';
    foreach ($sentences as $key => $sentence) {
        $new_string .= ($key & 1) == 0
            ? ucfirst(strtolower(trim($sentence)))
            : $sentence . ' ';
    }
    return trim($new_string);
}

如果句子不在段落中,则一切正常。但如果句子在段落中,则开头段落 ( <p>) 或 break ( <br>) 标记 HTML 中的第一个字母变为小写。

这是示例:

前:

<p>Lorem IPSUM is simply dummy text. LOREM ipsum is simply dummy text! wHAt is LOREM IPSUM? Hello lorem ipSUM!</p>

输出:

<p>lorem ipsum is simply dummy text. Lorem ipsum is simply dummy text! What is lorem ipsum? Hello lorem ipsum!</p>

有人可以帮我把段落中的第一个字母变成大写字母吗?

4

4 回答 4

0

您的问题是您正在考虑句子中的 HTML,因此句子的第一个“单词”是<P>lorem, not Lorem.

您可以将正则表达式更改为 read /([>.?!]+)/,但这样您会在“Lorem”之前看到额外的空格,因为系统现在看到的是两个句子而不是一个。

此外,现在Hello <em>there</em>将被视为四个句子。

这看起来很像“如何使用正则表达式来解释 (X)HTML”的情况?

于 2017-09-25T06:27:42.423 回答
0

试试这个

function html_ucfirst($s) {
return preg_replace_callback('#^((<(.+?)>)*)(.*?)$#', function ($c) {
        return $c[1].ucfirst(array_pop($c));
 }, $s);
}

并调用此函数

$string= "<p>Lorem IPSUM is simply dummy text. LOREM ipsum is simply dummy text! wHAt is LOREM IPSUM? Hello lorem ipSUM!</p>";
echo html_ucfirst($string);

这是工作演示: https ://ideone.com/fNq3Vo

于 2017-09-25T06:38:10.627 回答
0

解析有效的 html 时,最好使用合法的 DOM 解析器。使用正则表达式并不可靠,因为正则表达式不知道标记和类似于标记的子字符串之间的区别。

代码:(演示

$html = <<<HTML
<p>Lorem IPSUM is simply dummy text.<br>Here is dummy text. LOREM ipsum is simply dummy text! wHAt is LOREM IPSUM? Hello lorem ipSUM!</p>
HTML;

libxml_use_internal_errors(true);
$dom = new DOMDocument();
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);
foreach($xpath->query('//text()') as $textNode) {
    $textNode->nodeValue = preg_replace_callback(
        '/(?:^|[.!?]) *\K[a-z]+/',
        function($m) {
            return ucfirst($m[0]);
        },
        strtolower($textNode->nodeValue)
    );
}
echo $dom->saveHTML();

输出:

<p>Lorem ipsum is simply dummy text.<br>Here is dummy text. Lorem ipsum is simply dummy text! What is lorem ipsum? Hello lorem ipsum!</p>

上面的片段没有:

  1. 允许首字母缩略词保持全大写(因为 OP 想要在选择字母大写之前将所有字母转换为小写)
  2. 不费心正确处理多字节字符(因为 OP 没有表明这种必要性)
  3. 不知道句中点和句尾点之间的区别(由于英语标点符号的歧义)
于 2021-10-25T10:28:51.470 回答
-1

你可以很容易地用 CSS 做到这一点

p::first-letter {
    text-transform: uppercase;
}
于 2017-09-25T06:23:33.907 回答