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.
(PHP 4, PHP 5, PHP 7, PHP 8)
strcspn — Encuentra un segmento de string que no contiene ciertos caracteres
Devuelve la longitud del primer segmento de string
que no contiene ninguno de los caracteres de
characters
.
Si offset
y length
son omitidos, entonces se examinará la totalidad de string
.
Si se incluyen, el efecto será idéntico a
llamar a strcspn(substr($string, $offset, $length),
$characters)
(ver substr para más
información).
string
El string a examinar.
characters
El string que contiene todos los caracteres desactivados.
offset
La posición en string
desde la cual se comienza a buscar.
Si offset
es proporcionado y no es negativo,
entonces strcspn() comenzará a examinar
string
en la
posición offset
. Por ejemplo, en
el string 'abcdef
', el carácter en la posición
0
es 'a
', el carácter
en la posición 2
es
'c
', y así sucesivamente.
Si offset
es proporcionado y es negativo,
entonces strspn() comenzará a examinar
string
en la
posición offset
desde el final de
string
.
length
La longitud del segmento de string
a examinar.
Si length
es proporcionado y no es negativo,
entonces string
será examinado
desde length
caracteres después de la posición de
inicio.
Si length
es proporcionado y es negativo,
entonces string
será examinado desde la
posición de inicio hasta length
caracteres desde el final de string
.
Devuelve la longitud del segmento inicial de string
que contiene solo caracteres que no están no
en characters
.
Nota:
Cuando el parámetro
offset
está definido, la longitud devuelta se cuenta desde esta posición, y no desde el inicio destring
.
Versión | Descripción |
---|---|
8.4.0 |
Antes de PHP 8.4.0, cuando characters era un string vacío,
la búsqueda se detenía incorrectamente en el primer byte nulo en string .
|
8.0.0 |
length ahora es nullable.
|
Ejemplo #1 Ejemplo con 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);
?>
El ejemplo anterior mostrará :
int(1) int(0) int(6) int(5) int(4)
Nota: Esta función maneja strings binarios.
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.
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";
}
?>
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.
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').
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');
?>