sustituir - php cadena de coincidencia con el comodín*?
remove html tags from string (5)
El único problema que tendrás es que la llamada a preg_quote()
escapará del carácter de asterisco. Dado eso, tu str_replace()
reemplazará el *
, pero no el carácter de escape delante de él.
Por lo tanto, debe cambiar el str_replace(''*'' ..)
con str_replace(''/*''..)
Quiero dar la posibilidad de hacer coincidir una cadena con un comodín *
.
Ejemplo
$mystring = ''dir/folder1/file'';
$pattern = ''dir/*/file'';
stringMatchWithWildcard($mystring,$pattern); //> Returns true
Ejemplo 2:
$mystring = ''string bl#abla;y'';
$pattern = ''string*y'';
stringMatchWithWildcard($mystring,$pattern); //> Returns true
Pensé algo como:
function stringMatch($source,$pattern) {
$pattern = preg_quote($pattern,''/'');
$pattern = str_replace( ''/*'' , ''.*?'', $pattern); //> This is the important replace
return (bool)preg_match( ''/^'' . $pattern . ''$/i'' , $source );
}
¿Básicamente reemplazando *
a .*?
(considerando en *nix
environment *
coincide empty
cadena empty
) © vbence
¿Alguna mejora / sugiere?
// Se agregó return (bool)
porque preg_match devuelve int
Estás mezclando el final ( $
) y el comienzo ( ^
). Esta:
preg_match( ''/$'' . $pattern . ''^/i'' , $source );
Debiera ser:
preg_match( ''/^'' . $pattern . ''$/i'' , $source );
No hay necesidad de preg_match
aquí. PHP tiene una función de comparación de comodines, hecha específicamente para tales casos:
Y es fnmatch(''dir/*/file'', ''dir/folder1/file'')
ya funcione para usted. Pero tenga en cuenta que el comodín *
también agregaría otras barras, como lo haría preg_match.
Solo debes usar .*
lugar.
$pattern = str_replace( ''*'' , ''.*'', $pattern); //> This is the important replace
Edit: También tu ^
y $
estaban en el orden equivocado.
<?php
function stringMatchWithWildcard($source,$pattern) {
$pattern = preg_quote($pattern,''/'');
$pattern = str_replace( ''/*'' , ''.*'', $pattern);
return preg_match( ''/^'' . $pattern . ''$/i'' , $source );
}
$mystring = ''dir/folder1/file'';
$pattern = ''dir/*/file'';
echo stringMatchWithWildcard($mystring,$pattern);
$mystring = ''string bl#abla;y'';
$pattern = ''string*y'';
echo stringMatchWithWildcard($mystring,$pattern);
Demostración de trabajo: http://www.ideone.com/mGqp2
.+?
Causas de coincidencia no codiciosos para todos los personajes. Esto NO es igual a "*" porque no coincidirá con la cadena vacía.
El siguiente patrón también coincidirá con la cadena vacía:
.*?
asi que...
stringMatchWithWildcard ("hello", "hel*lo"); // will give true