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.