記事を管理できるphp Webサイトがあります。新規記事追加フォームに入力文字数を制限したいリッチテキストボックス(HTML入力可)があります。サーバー側でチェックするので、strlen()
Docsメソッドを使用します。
問題はstrlen
、大きすぎる数値を与えるようです。html_entity_decode()
Docsを使用して文字列から html タグを取得しようとしましたが、それでも結果の文字列の長さが間違っているようです。
記事を管理できるphp Webサイトがあります。新規記事追加フォームに入力文字数を制限したいリッチテキストボックス(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
。ドキュメント (またはフラグメント) を読み込み、ドキュメントのコンテンツを表す 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>
これは、タグ内のテキストなどを含むテキストサイズをカウントすることに注意してください。