with sustituir remove from escape delete convert cadenas allow all php regex string-matching

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:

fnmatch()

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