2012-04-10 11 views
2

私は記事を管理できるPHP Webサイトを持っています。新しい記事の追加フォームには、文字入力回数を制限したいリッチテキストボックス(HTML入力が可能)があります。私はstrlen()­Docsメソッドを使用してサーバー側をチェックします。HTMLタグを含むテキストの入力長を制限する

問題はstrlenはあまりにも大きい数値を与えるようです。私はhtml_entity_decode()­Docsを使用して、文字列からHTMLタグを取得しようとしましたが、結果として文字列の長さは間違っているようです。

+0

「方法が大きすぎる」とはどういう意味ですか? utf-8のテキストではなく、いくつかのアジア文字を使用していますか? – nothrow

+3

'mb_strlen(strip_tags($ _ POST ['txtinput']))'マルチバイト対応の関数でタグを取り除いた後の長さを確認する –

答えて

5

html_entity_decodeはHTMLエンティティのみをデコードしますが、HTMLタグは無視しません。試してみてください:

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

またはマルチバイト換算:

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

マルチバイト文字を含める場合は、 'mb_strlen()'を作成してください。 –

+0

@Michael:Thanks私はその問題に取り組んだ。 =) –

+0

@AlixAxel:入力エンコーディングが不明なので、 'utf8_decode'を提案するのは正しいとは思わない。入力がUTF-8でエンコードされている場合、 'utf8_decode'は文字を削除することもあります。 – hakre

1

あなたは文字の数を取得したいが、あなたは、HTMLマークアップをカウントする必要はありません。

これは、DOMDocumentのようなHTMLパーサーを使用して行うことができます。あなたの文書(またはフラグメント)にロードし、文書の内容を表して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>タグ内のテキストを含むテキストサイズをカウントするように注意してください。

+0

ありがとう!これは素晴らしい解決策でもあります:-) –

+0

関連するxpathの使い方は、[html *の*サブストリングへのこの回答](http://stackoverflow.com/a/10210900/367456)で説明されています。 – hakre

関連する問題