「テンプレートの回答」について-「より速く作業する」という要求はありません。ここでは長い時間や多くのカウントについて話しているわけではないので、数ミリ秒長くかかるかどうかは誰が気にしますか?
ただし、ソフト ハイフンを使用する str_word_count は次のようになります。
function my_word_count($str) {
return str_word_count(str_replace("\xC2\xAD",'', $str));
}
アサーションに準拠する関数 (ただし、おそらく str_word_count よりも高速ではありません):
function my_word_count($str) {
$mystr = str_replace("\xC2\xAD",'', $str); // soft hyphen encoded in UTF-8
return preg_match_all('~[\p{L}\'\-]+~u', $mystr); // regex expecting UTF-8
}
preg 関数は、a) 既にカウントを返すため、一致を提供する必要がないことを除いて、既に提案されているものと本質的に同じです。
コメントについて:
あなたの PCRE 関数は私の preg_word_count() よりも wrost (パフォーマンス) であることがわかります。必要のない str_replace が必要なためです: '~[^\p{L}\'-\xC2\xAD]+~u' は正常に動作します ( !)。
別のこと、文字列の置換はマルチバイト文字のみを削除すると考えましたが、あなたの正規表現はそれらが表示される可能性のある順序で処理されますが、これは間違っています\\xC2
。\xC2\xAE である登録済みの記号\\xAD
を考えてみましょう。
しかし、有効な UTF-8 の仕組みから考えると、それほど問題にはならないので、同じように使用できるはずです。したがって、関数を持つことができます
function my_word_count($str) {
return preg_match_all('~[\p{L}\'\-\xC2\xAD]+~u', $str); // regex expecting UTF-8
}
マッチやその他の交換は必要ありません。
str_word_count(str_replace("\xC2\xAD",'', $str));については、UTF8で安定していれば良いのですが、そうではないようです。
このスレッドを読むと、有効な UTF-8 文字列を使用する場合に str_replace が安全であることがわかります。あなたのリンクに反対の証拠はありませんでした。