PHP
Análisis de cuerdas
Buscar..
Observaciones
Se debe usar Regex para otros usos además de sacar cuerdas de las cuerdas o cortar las cuerdas de otra manera.
Dividir una cadena por separadores
explode
y strstr
son métodos más simples para obtener subcadenas por separadores.
Una cadena que contiene varias partes del texto que están separadas por un carácter común se puede dividir en partes con la función de explode
.
$fruits = "apple,pear,grapefruit,cherry";
print_r(explode(",",$fruits)); // ['apple', 'pear', 'grapefruit', 'cherry']
El método también admite un parámetro de límite que se puede utilizar de la siguiente manera:
$fruits= 'apple,pear,grapefruit,cherry';
Si el parámetro límite es cero, esto se trata como 1.
print_r(explode(',',$fruits,0)); // ['apple,pear,grapefruit,cherry']
Si se establece límite y positivo, la matriz devuelta contendrá un máximo de elementos límite con el último elemento que contiene el resto de la cadena.
print_r(explode(',',$fruits,2)); // ['apple', 'pear,grapefruit,cherry']
Si el parámetro límite es negativo, se devuelven todos los componentes excepto el último límite.
print_r(explode(',',$fruits,-1)); // ['apple', 'pear', 'grapefruit']
explode
se puede combinar con list
para analizar una cadena en variables en una línea:
$email = "[email protected]";
list($name, $domain) = explode("@", $email);
Sin embargo, asegúrese de que el resultado de la explode
contenga suficientes elementos, o se activará una advertencia de índice no definido.
strstr
quita o solo devuelve la subcadena antes de la primera aparición de la aguja dada.
$string = "1:23:456";
echo json_encode(explode(":", $string)); // ["1","23","456"]
var_dump(strstr($string, ":")); // string(7) ":23:456"
var_dump(strstr($string, ":", true)); // string(1) "1"
Buscando una subcadena con strpos
strpos
puede entenderse como el número de bytes en el pajar antes de la primera aparición de la aguja.
var_dump(strpos("haystack", "hay")); // int(0)
var_dump(strpos("haystack", "stack")); // int(3)
var_dump(strpos("haystack", "stackoverflow"); // bool(false)
Comprobando si existe una subcadena
Tenga cuidado con la comprobación contra VERDADERO o FALSO porque si se devuelve un índice de 0, una instrucción if lo verá como FALSO.
$pos = strpos("abcd", "a"); // $pos = 0;
$pos2 = strpos("abcd", "e"); // $pos2 = FALSE;
// Bad example of checking if a needle is found.
if($pos) { // 0 does not match with TRUE.
echo "1. I found your string\n";
}
else {
echo "1. I did not found your string\n";
}
// Working example of checking if needle is found.
if($pos !== FALSE) {
echo "2. I found your string\n";
}
else {
echo "2. I did not found your string\n";
}
// Checking if a needle is not found
if($pos2 === FALSE) {
echo "3. I did not found your string\n";
}
else {
echo "3. I found your string\n";
}
Salida de todo el ejemplo:
1. I did not found your string
2. I found your string
3. I did not found your string
Búsqueda a partir de un offset
// With offset we can search ignoring anything before the offset
$needle = "Hello";
$haystack = "Hello world! Hello World";
$pos = strpos($haystack, $needle, 1); // $pos = 13, not 0
Consigue todas las apariciones de una subcadena.
$haystack = "a baby, a cat, a donkey, a fish";
$needle = "a ";
$offsets = [];
// start searching from the beginning of the string
for($offset = 0;
// If our offset is beyond the range of the
// string, don't search anymore.
// If this condition is not set, a warning will
// be triggered if $haystack ends with $needle
// and $needle is only one byte long.
$offset < strlen($haystack); ){
$pos = strpos($haystack, $needle, $offset);
// we don't have anymore substrings
if($pos === false) break;
$offsets[] = $pos;
// You may want to add strlen($needle) instead,
// depending on whether you want to count "aaa"
// as 1 or 2 "aa"s.
$offset = $pos + 1;
}
echo json_encode($offsets); // [0,8,15,25]
Analizando la cadena usando expresiones regulares
preg_match puede usarse para analizar cadenas usando expresiones regulares. Las partes de la expresión entre paréntesis se denominan subpatrones y con ellas puede seleccionar partes individuales de la cadena.
$str = "<a href=\"http://example.org\">My Link</a>";
$pattern = "/<a href=\"(.*)\">(.*)<\/a>/";
$result = preg_match($pattern, $str, $matches);
if($result === 1) {
// The string matches the expression
print_r($matches);
} else if($result === 0) {
// No match
} else {
// Error occured
}
Salida
Array
(
[0] => <a href="http://example.org">My Link</a>
[1] => http://example.org
[2] => My Link
)
Subcadena
La subcadena devuelve la porción de cadena especificada por los parámetros de inicio y longitud.
var_dump(substr("Boo", 1)); // string(2) "oo"
Si existe la posibilidad de cumplir con cadenas de caracteres de múltiples bytes, sería más seguro usar mb_substr.
$cake = "cakeæøå";
var_dump(substr($cake, 0, 5)); // string(5) "cake�"
var_dump(mb_substr($cake, 0, 5, 'UTF-8')); // string(6) "cakeæ"
Otra variante es la función substr_replace, que reemplaza el texto dentro de una parte de una cadena.
var_dump(substr_replace("Boo", "0", 1, 1)); // string(3) "B0o"
var_dump(substr_Replace("Boo", "ts", strlen("Boo"))); // string(5) "Boots"
Digamos que quiere encontrar una palabra específica en una cadena y no quiere usar Regex.
$hi = "Hello World!";
$bye = "Goodbye cruel World!";
var_dump(strpos($hi, " ")); // int(5)
var_dump(strpos($bye, " ")); // int(7)
var_dump(substr($hi, 0, strpos($hi, " "))); // string(5) "Hello"
var_dump(substr($bye, -1 * (strlen($bye) - strpos($bye, " ")))); // string(13) " cruel World!"
// If the casing in the text is not important, then using strtolower helps to compare strings
var_dump(substr($hi, 0, strpos($hi, " ")) == 'hello'); // bool(false)
var_dump(strtolower(substr($hi, 0, strpos($hi, " "))) == 'hello'); // bool(true)
Otra opción es un análisis muy básico de un correo electrónico.
$email = "[email protected]";
$wrong = "foobar.co.uk";
$notld = "foo@bar";
$at = strpos($email, "@"); // int(4)
$wat = strpos($wrong, "@"); // bool(false)
$nat = strpos($notld , "@"); // int(3)
$domain = substr($email, $at + 1); // string(11) "example.com"
$womain = substr($wrong, $wat + 1); // string(11) "oobar.co.uk"
$nomain = substr($notld, $nat + 1); // string(3) "bar"
$dot = strpos($domain, "."); // int(7)
$wot = strpos($womain, "."); // int(5)
$not = strpos($nomain, "."); // bool(false)
$tld = substr($domain, $dot + 1); // string(3) "com"
$wld = substr($womain, $wot + 1); // string(5) "co.uk"
$nld = substr($nomain , $not + 1); // string(2) "ar"
// string(25) "[email protected] is valid"
if ($at && $dot) var_dump("$email is valid");
else var_dump("$email is invalid");
// string(21) "foobar.com is invalid"
if ($wat && $wot) var_dump("$wrong is valid");
else var_dump("$wrong is invalid");
// string(18) "foo@bar is invalid"
if ($nat && $not) var_dump("$notld is valid");
else var_dump("$notld is invalid");
// string(27) "foobar.co.uk is an UK email"
if ($tld == "co.uk") var_dump("$email is a UK address");
if ($wld == "co.uk") var_dump("$wrong is a UK address");
if ($nld == "co.uk") var_dump("$notld is a UK address");
O incluso poner "Continuar leyendo" o "..." al final de una propaganda
$blurb = "Lorem ipsum dolor sit amet";
$limit = 20;
var_dump(substr($blurb, 0, $limit - 3) . '...'); // string(20) "Lorem ipsum dolor..."