限制包含HTML标记的文本的输入长度

时间:2012-04-10 12:45:06

标签: php html strlen

我有一个php网站,我可以管理文章。在添加新文章表单上,有一个富文本框(允许HTML输入),我想限制字符输入计数。我在服务器端检查所以使用strlen()­Docs方法。

问题是strlen似乎给出了一个太大的数字。我试图使用html_entity_decode()­Docs从字符串中获取html标签但仍然是字符串长度似乎是错误的。

2 个答案:

答案 0 :(得分:5)

html_entity_decode仅解码HTML实体,不会忽略HTML标记。尝试:

strlen(strip_tags(html_entity_decode($string)));

或多字节等价物:

mb_strlen(strip_tags(html_entity_decode($string)), 'auto');

答案 1 :(得分:1)

您想获取字符数,但不想计算HTML标记。

您可以使用HTML解析器来完成此操作,例如DOMDocument。您加载文档(或片段),获取表示文档内容的body标记,获取它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>标记内的文字等内容。