Quiero limpiar una lista de etiquetas separadas por comas para eliminar las etiquetas vacías y los espacios adicionales. se me ocurrio
$str='first , second ,, third, ,fourth suffix'; echo preg_replace('#[,]{2,}#',',',preg_replace('#\s*,+\s*#',',',preg_replace('#\s+#s',' ',$str)));que funciona bien hasta ahora, pero ¿es posible hacerlo en un solo reemplazo?
Puedes usar:
[\h*([,\h])[,\h]*Vea una demostración en línea. O alternativamente:
\h*([,\h])(?1)*Ver una demostración en línea
\h* - 0+ (codiciosos) caracteres de espacio en blanco horizontal;([,\h]) - Un primer grupo de captura para hacer coincidir una coma o un espacio en blanco horizontal;[,\h]* - Opción 1 : 0+ (codiciosos) caracteres de coma o espacio en blanco horizontal;(?1)* - Opción 2 : Recurre el primer subpatrón 0+ (Greedy) veces.Reemplace con el primer grupo de captura:
$str='first , second ,, third, ,fourth suffix'; echo preg_replace('~\h*([,\h])[,\h]*~', '$1', $str); echo preg_replace('~\h*([,\h])(?1)*~', '$1', $str);Ambos imprimen:
first,second,third,fourth suffixPuedes usar
preg_replace('~\s*(?:(,)\s*)+|(\s)+~', '$1$2', $str)La fusión de las dos alternativas en una da como resultado
preg_replace('~\s*(?:([,\s])\s*)+~', '$1', $str)Vea la demostración de expresiones regulares y la demostración de PHP . Detalles :
\s*(?:(,)\s*)+ - cero o más espacios en blanco y luego una o más apariciones de una coma (capturada en el Grupo 1 ( $1 )) y luego cero o más espacios en blanco| - o(\s)+ - uno o más espacios en blanco al capturar el último en el Grupo 2 ( $2 ). En la segunda expresión regular, ([,\s]) captura una sola coma o un carácter de espacio en blanco.