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