Saltar al contenido

búsqueda de php string (con comodines)

Ya no tienes que buscar más por todo internet porque has llegado al sitio perfecto, contamos con la respuesta que quieres y sin complicarte.

Solución:

Este es uno de los pocos casos en los que las expresiones regulares son realmente útiles. 🙂

if (preg_match('/my (w+) has/', $str, $matches)) 
    echo $matches[1];

Consulte la documentación de preg_match.

el patrón comodín podría convertirse en un patrón regex como este

function wildcard_match($pattern, $subject) 
  $pattern = strtr($pattern, array(
    '*' => '.*?', // 0 or more (lazy) - asterisk (*)
    '?' => '.', // 1 character - question mark (?)
  ));
  return preg_match("/$pattern/", $subject);

si string contiene caracteres especiales, por ejemplo, .+*?^$|/’#, deben ser -escapado

no probar:

function wildcard_match($pattern, $subject) /'#";
  $special_chars = str_split($special_chars);
  $escape = array();
  foreach ($special_chars as $char) $escape[$char] = "\$char";
  $pattern = strtr($pattern, $escape);
  $pattern = strtr($pattern, array(
    '*' => '.*?', // 0 or more (lazy) - asterisk (*)
    '?' => '.', // 1 character - question mark (?)
  ));
  return preg_match("/$pattern/", $subject);

Estoy de acuerdo en que las expresiones regulares son mucho más flexibles que los comodines, pero a veces todo lo que quieres es una forma sencilla de definir patrones. Para las personas que buscan una solución portátil (no solo *NIX), aquí está mi implementación de la función:

function wild_compare($wild, $string) 
    $wild_i = 0;
    $string_i = 0;

    $wild_len = strlen($wild);
    $string_len = strlen($string);

    while ($string_i < $string_len && $wild[$wild_i] != '*') 
        if (($wild[$wild_i] != $string[$string_i]) && ($wild[$wild_i] != '?')) 
            return 0;
        
        $wild_i++;
        $string_i++;
    

    $mp = 0;
    $cp = 0;

    while ($string_i < $string_len) 
        if ($wild[$wild_i] == '*') 
            if (++$wild_i == $wild_len) 
                return 1;
            
            $mp = $wild_i;
            $cp = $string_i + 1;
        
        else
        if (($wild[$wild_i] == $string[$string_i]) 

    while ($wild[$wild_i] == '*') 
        $wild_i++;
    

    return $wild_i == $wild_len ? 1 : 0;

Naturalmente, la implementación de PHP es más lenta que fnmatch(), pero funcionaría en cualquier plataforma.

Se puede usar así:

if (wild_compare('regex are * useful', 'regex are always useful') == 1) 
    echo "I'm glad we agree on this";

Recuerda algo, que tienes concesión de parafrasear tu experiencia si diste con el arreglo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *