Tengo que revisar varias cadenas... el formato de cada cadena podría ser el siguiente:
I-IVWM_Ask-21_(max_2h)o
D-7849_DG303_(max_4h)o
Aliante_PrivatoNecesito capturar el texto entre corchetes, la primera parte de la cadena fuera de los corchetes y reemplazar el guión bajo con espacios.
Estoy tratando de usar preg_match en PHP, como sigue
preg_replace('/\([^)]*\)|[()]/', '', $string);El código anterior elimina la cadena y los corchetes, pero deja el guión bajo y no captura la cadena dentro de los corchetes.
¿Alguna ayuda para resolver mi problema? Gracias
Lo que podría hacer es primero hacer coincidir el patrón y, para la coincidencia, reemplace los paréntesis y los guiones bajos con un espacio usando preg_replace_callback .
Patrón para combinar con las cuerdas:
^[^\s()]+(?:\([^()]*\))?$^ Comienzo de cadena[^\s()]+ Match 1+ caracteres que no sean paréntesis o espacios en blanco(?:\([^()]*\))? Opcionalmente, haga coincidir la parte entre paréntesis.$ Fin de la cadenaDemostración de expresiones regulares | demostración de php
Por ejemplo
$strings = [ "I-IVWM_Ask-21_(max_2h)", "D-7849_DG303_(max_4h)", "Aliante_Privato" ]; foreach ($strings as $str) { $pattern = "/^[^\s()]+(?:\([^()]*\))?$/"; echo preg_replace_callback($pattern, function ($x) { return trim(preg_replace("/[()_]+/", " ", $x[0])); }, $str) . PHP_EOL; }Producción
I-IVWM Ask-21 max 2h D-7849 DG303 max 4h Aliante Privato$strings = [ "I-IVWM_Ask-21_(max_2h)", "D-7849_DG303_(max_4h)", "Aliante_Privato" ]; $result = array_map('trim', preg_filter('~[_()]+~', ' ', $strings));