Actualmente estoy luchando con expresiones regulares para lograr algo y no puedo tener éxito por mi cuenta...
Aquí mi cadena: path/to/folder/@here
Lo que quiero es algo como esto: a:path/a:to/a:folder/@here
Así que mi expresión regular es la siguiente: /([^\/]+)/g , pero el problema es que el resultado será ( preg_replace('/([^\/@]+)/', 'a:$0' ): a:path/a:to/a:folder/a:@here ...
¿Cómo puedo omitir el reemplazo si el grupo capturado contiene @ ?
Probé este, sin ningún éxito: /((?!@)[^\/]+)/g
Otra opción podría ser hacer coincidir lo que desea evitar y utilizar un enfoque SKIP FAIL .
/@[^/@]*(*SKIP)(*F)|[^/]+/@ Coincide literalmente[^/@]*(*SKIP)(*F) Opcionalmente, haga coincidir cualquier carácter excepto / y @ y luego omita esta coincidencia| O[^/]+ Coincidir con 1+ ocurrencias de cualquier carácter excepto /Vea una demostración de expresiones regulares y una demostración de PHP .
Por ejemplo
$str = 'path/to/folder/@here'; echo preg_replace('#/@[^/@]*(*SKIP)(*F)|[^/]+#', 'a:$0', $str);Producción
a:path/a:to/a:folder/@herePuedes usar
(?<![^\/])[^\/@][^\/]*Vea la demostración de expresiones regulares . Detalles :
(?<![^\/]) - una mirada retrospectiva negativa que requiere el inicio de una cadena o un carácter / para aparecer inmediatamente a la izquierda de la ubicación actual[^\/@] - un carácter distinto de / y @[^\/]* - cero o más caracteres que no sean / .Vea la demostración de PHP :
$text = 'path/to/folder/@here'; echo preg_replace('~(?<![^/])[^/@][^/]*~', 'a:$0', $text); // => a:path/a:to/a:folder/@here