totalmente atascado en RegEx que funciona en el sandbox de prueba pero no funciona en vivo

Estoy totalmente atrapado en esto.

Escribí este patrón RegEx que se supone que obtiene el valor de una cadena de un archivo cuyos contenidos obtengo con file_get_contents ();

El RegEx que escribí es este:

/.*\$test_variable\s*=\s*'?(.*?)'?;.*/is 

Mi función es:

 function tbs_quick_setting_find($variable) { global $savedsettings; $setting = preg_replace("/.*\$".$variable."\s*=\s*'?(.*?)'?;.*/is",'$1',$savedsettings); if (!empty($setting)) { return $setting; } else { return false; // value is NOT set } } 

Extrañamente, esto funciona bien cuando se prueba, como aquí: http://regex101.com/r/wN4lJ3 pero no funciona cuando lo pruebo en mi sitio web, en lugar del valor de la variable obtengo todo el contenido de $ Archivo de archivos guardados.

Cualquier ayuda sería muy apreciada. Gracias

Coincidencia de un signo de $ con PHP regex: cómo y por qué escapar

Normalmente coloco el patrón en comillas simples, donde un single \ debería ser suficiente para escapar de un $ como literal. Para hacer coincidir $ en un patrón de expresiones regulares de doble cita, las cosas pueden ser confusas.

Todas esas variantes deberían funcionar:

1.) Usando comillas simples para el patrón, uno \ debería ser suficiente para escapar $ como un literal

 '/.*\$'.$variable.'\s*=\s*\'?(.*?)\'?;.*/is' 

2.) Imho usando comillas dobles , tendrías que escapar dos veces de los $ porque dentro de un patrón de expresiones regulares es un metacalendario que coincide con la posición de la cadena o del final de la línea, además interpola una variable dentro de las comillas dobles. ¿Por qué tripple, escapar de eso? No tengo idea todavía 🙂

 "/.*\\$".$variable."\s*=\s*'?(.*?)'?;.*/is" 

3.) Ya sea que estés usando comillas dobles o simples para el patrón, una forma segura siempre debería ser poner $ en una clase de caracteres :

 "/.*[$]".$variable."\s*=\s*'?(.*?)'?;.*/is" 

Por favor, siéntete libre de comentar / corregir, donde estoy equivocado.

Prueba esto:

 function tbs_quick_setting_find($variable) { global $savedsettings; $re = "/.*\\\$" . $variable . "\s*=\s*'?(.*?)'?;.*/is"; $setting = preg_replace($re,'$1',$savedsettings); if (!empty($setting)) { return $setting; } else { return false; // value is NOT set } } 

el problema estaba aquí \\\$ . Necesitamos escapar de los caracteres “\” y “$” para el trabajo de expresión.

ejemplo:

 echo "/.*\$".$variable."\s*=\s*'?(.*?)'?;.*/is"; 

/.*$test_variable\s*=\s*'?(.*?)'?;.*/is esta expresión /.*$test_variable\s*=\s*'?(.*?)'?;.*/is (no coincide con nada)

La forma correcta sería:

 echo "/.*\\\$".$variable."\s*=\s*'?(.*?)'?;.*/is"; 

que escupe esta expresión /.*\$test_variable\s*=\s*'?(.*?)'?;.*/is (que coinciden correctamente)