con respecto a esta publicación "https://stackoverflow.com/questions/35413960/regular-expression-match-all-except-first-occurence" me pregunto cómo encontrar la primera ocurrencia en una cadena solo si comienza con un carácter específico en PHP.
Me gustaría desinfectar los números de teléfono. Ejemplo de número de teléfono incorrecto:
+49+12423#23492@aosd#+dasdRegex para eliminar todos los "+" excepto la primera aparición.
\G(?:\A[^\+]*\+)?+[^\+]*\K\+Problema: debe eliminar cada "+" solo si comienza con "+", no si la primera posición de ocurrencia es mayor que 1.
La expresión regular para eliminar todo excepto los números es fácil:
[^0-9]*Pero no sé cómo combinar esos dos dentro de una expresión regular. Simplemente usaría preg_replace() dos veces.
Por supuesto, podría usar una solución como if ($str[0] === '+') {...} pero prefiero aprender algunas cosas nuevas (regex :)
Gracias por ayudar.
Puedes usar
(?:\G(?!\A)|^\+)[^+]*\K\+Vea la demostración de expresiones regulares . Detalles :
(?:\G(?!\A)|^\+) - ya sea el final de la coincidencia exitosa anterior o un + al comienzo de la cadena[^+]* - cero o más caracteres que no sean +\K - operador de restablecimiento de coincidencia descartando el texto coincidente hasta el momento\+ - un + carácter.Vea la demostración de PHP :
$re = '/(?:\G(?!\A)|^\+)[^+]*\K\+/m'; $str = '+49+12423#23492@aosd#+dasd'; echo preg_replace($re, '', $str); // => +4912423#23492@aosd#dasdParece que desea combinar las dos consultas:
Una expresión regular para eliminar todo excepto los números
Una expresión regular para eliminar todos los "+" excepto la primera aparición
Aquí están mis dos centavos:
(?:^\+|\d)(*SKIP)(*F)|.Reemplazar lo que se empareja con nada. Aquí hay una demostración en línea
(?:^\+|\d) - Un grupo sin captura para hacer coincidir un literal inicial más o cualquier dígito en el rango de 0-9.(*SKIP)(*F) - Consume los caracteres coincidentes anteriores y falla en el resto del resultado coincidente.| - O:. - Cualquier carácter único que no sea nueva línea. Me gustaría pensar que esta es una ligera adaptación de lo que algunos consideran "El mejor truco de expresiones regulares" , en el que uno intentaría primero hacer coincidir lo que no desea y luego usar una alternancia para hacer coincidir lo que sí desea. Con el uso de los verbos de control de retroceso (*SKIP)(*F) invertimos la lógica. Primero hacemos coincidir lo que queremos , lo excluimos de los resultados y luego hacemos coincidir lo que no queremos.