strcspn
(PHP 4, PHP 5, PHP 7, PHP 8)
strcspn — マスクにマッチしない最初のセグメントの長さを返す
説明
string
において characters
の文字がどれも含まれていない最初のセグメントの長さを返します。
offset
と length
を省略した場合は、string
の全体を調べます。
これらのパラメータを指定した場合は、
strcspn(substr($string, $offset, $length),
$characters)
をコールするのと同じ動きになります。
(詳細は substr を参照ください)。
パラメータ
string
-
調べたい文字列。
characters
-
許可しない文字をすべて含む文字列。
offset
-
string
の中で調べ始める位置。offset
に非負の値を指定した場合は、 strcspn() は、string
のoffset
番目の文字から調べ始めます。 たとえば 'abcdef
' という文字列があったとすると、0
番目の文字が 'a
' で2
番目の文字は 'c
' のようになります。offset
に負の値を指定した場合は、 strcspn() は、string
の後ろからoffset
番目の文字から調べ始めます。 length
-
string
の中での調べるセグメントの長さ。length
に非負の値を指定した場合は、string
の開始位置からlength
文字ぶんだけ調べます。length
に負の値を指定した場合は、string
の開始位置から調べ始めて、string
の末尾からlength
文字目のところまで調べます。
戻り値
string
の中で、
characters
の文字をまったく含まない
最初のセグメントの長さを返します。
注意:
offset
を指定した場合は、その位置から長さを数え始めます。string
の先頭から数えるわけではありません。
変更履歴
バージョン | 説明 |
---|---|
8.4.0 |
PHP 8.4.0 より前のバージョンでは、 characters が空の文字列の場合、
string 内の最初の null バイトで探索が誤って停止してしまうことがありました。
|
8.0.0 |
length は、nullable になりました。
|
例
例1 strcspn() の例
<?php
$a = strcspn('banana', 'a');
$b = strcspn('banana', 'abcd');
$c = strcspn('banana', 'z');
$d = strcspn('abcdhelloabcd', 'a', -9);
$e = strcspn('abcdhelloabcd', 'a', -9, -5);
var_dump($a);
var_dump($b);
var_dump($c);
var_dump($d);
var_dump($e);
?>
上の例の出力は以下となります。
int(1) int(0) int(6) int(5) int(4)
注意
注意: この関数はバイナリデータに対応しています。
User Contributed Notes 5 notes
this function can be used like strspn(), except while that can be used to compare a string with an allowed pattern, this one can be use to compare a string with a FORBIDDEN pattern
so, to know if any forbidden character has a position inside our string, we can use (not tested with backslashes)...
<?php
// LARGE VERSION
$forbidden="\"\\?*:/@|<>";
if (strlen($filename) != strcspn($filename,$forbidden)) {
echo "you cant create a file with that name!";
}
// SHORT VERSION
if (strlen($filename) - strcspn($filename,"\"\\?*:/@|<>")) {
echo "i told you, you cant create that file";
}
?>
useful for finding beginning of quotes and/or tags in a variable containing html.
$pos = strcspn($data, '<"\'');
will find the first occurance of either the beginning of a tag, or a double- or single-quoted string.
When you use the third parameter remember that the function will return the number of characters it bypassed, which will *not* be the position in your source string. It's a simple fix to just add your third parameter value to the function result to get the position in the first string where the scan stopped, but I didn't think of it at first.
strcspn() can also be thought of as analogous to the following regular expression:
<?php
// where ... represents the mask of characters
preg_match('/[^ ...]/', substr($subject, $start, $length) );
?>
By this analogy, strcspn() can be used in place of some regular expressions to match a pattern without the overhead of a regex engine -- for example, ways to verify if an input string represents a binary value:
<?php
preg_match('/^[01]+$/i', $subject);
// or...
!preg_match('/[^01]/i', $subject);
// ...or using strcspn()
!strcspn($subject, '01');
?>
It might not be clear from the example, that
strcspn('abcdhelloabcd', 'abcd', -9, -5) == 4
because it's only evaluating 'hell' which doesn't contain any mask, so returns strlen('hell').