我有一个 php 网站,我可以在其中管理文章。在添加新文章表单上,有一个富文本框(允许 HTML 输入),我想限制字符输入计数。我在服务器端检查,所以使用strlen()
Docs方法。
问题strlen
似乎是给出了一个太大的数字。我尝试使用html_entity_decode()
Docs从字符串中获取 html 标签,但生成的字符串长度似乎仍然是错误的。
我有一个 php 网站,我可以在其中管理文章。在添加新文章表单上,有一个富文本框(允许 HTML 输入),我想限制字符输入计数。我在服务器端检查,所以使用strlen()
Docs方法。
问题strlen
似乎是给出了一个太大的数字。我尝试使用html_entity_decode()
Docs从字符串中获取 html 标签,但生成的字符串长度似乎仍然是错误的。
html_entity_decode
只解码 HTML 实体,它不会忽略 HTML 标签。尝试:
strlen(strip_tags(html_entity_decode($string)));
或多字节等价物:
mb_strlen(strip_tags(html_entity_decode($string)), 'auto');
您想获取字符数,但不想计算 HTML 标记。
您可以通过使用 HTML 解析器来做到这一点,例如DOMDocument
. 您加载文档(或片段),获取代表文档内容的主体标签,获取它nodeValue
,规范化它的空白,然后使用 UTF-8 兼容的字符计数功能:
$doc = new DOMDocument();
$doc->loadHTMLFile('test.html');
$body = $doc->getElementsByTagName('body')->item(0);
$text = $body->nodeValue;
$text = trim(preg_replace('/\s{1,}/u', ' ', $text));
printf("Length: %d character(s).\n", mb_strlen($text, 'utf-8'));
示例输入test.html
:
<body>
<div style='float:left'><img src='../../../../includes/ph1.jpg'></div>
<label style='width: 476px; height: 40px; position: absolute;top:100px; left: 40px; z-index: 2; background-color: rgb(255, 255, 255);; background-color: transparent' >
<font size="4">1a. Nice to meet you!</font>
</label>
<img src='ENG_L1_C1_P0_1.jpg' style='width: 700px; height: 540px; position: absolute;top:140px; left: 40px; z-index: 1;' />
<script type='text/javascript'>
swfobject.registerObject('FlashID');
</script>
<input type="image" id="nextPageBtn" src="../../../../includes/ph4.gif" style="position: absolute; top: 40px; left: 795px; ">
</body>
示例输出:
Length: 58 character(s).
规范化的文本是:
1a. Nice to meet you! swfobject.registerObject('FlashID');
请注意,这会计算文本大小,包括<script>
标签内的文本等内容。