preg_replace preg_match_all preg_match online ejemplos php regex preg-replace

php - preg_match_all - Regex para permitir solo alfanumérico, coma, guión, subrayado y punto y coma



regex string php (3)

Creo que lo que importa es la ubicación del guión: debe ser al principio o al final para que sea un guión (literal), de lo contrario, se utiliza para definir un rango.

¡Ya tengo un poco de código de trabajo pero necesito a alguien que me ayude a explicar por qué funciona si pueden!

Estoy utilizando PHP para reemplazar cualquier cosa en una cadena si no es az, AZ, 0-9, una coma, un punto y coma, un guión bajo o un guión (que en última instancia debe representar un solo nombre de usuario, o una coma / un punto y coma separados) lista de nombres de usuario).

Los siguientes trabajos:

$data = preg_replace(''/[^,;a-zA-Z0-9_-]/s'', '''', $data);

Pero lo siguiente no:

$data = preg_replace(''/[^a-zA-Z0-9_-,;]/s'', '''', $data);

¿Por qué esto solo funcionará cuando la coma y el punto y coma están al principio? Ponerlos al final parece romper cosas (esto es lo que intenté inicialmente cuando encontré / [^ a-zA-Z0-9 _-] / s.

Además, estoy usando lo siguiente para recortar cualquier punto y coma (plural) o coma (plural) y alguien puede sugerir una forma más eficiente y / o elegante de hacer esto:

if(preg_match(''/;$/'', $data)) { $data = rtrim($data, '';'' ); } if(preg_match(''/,$/'', $data)) { $data = rtrim($data, '','' ); }

Gracias por cualquier ayuda :)


No es la coma y el punto y coma lo que causa tu problema; es el guion Mira las partes de tu clase de personaje y considera lo que significan:

0-9 # Anything from ''0'' to ''9'', meaning 0, 1, 2, ... 9 A-Z # Anything from ''A'' to ''Z'', meaning A, B, C, ... Z _-, # Anything from ''_'' to '','', meaning...uh...hmmm.

No hay una progresión clara de _ a , por lo que el motor de expresiones regulares no está seguro de qué hacer con esto. En las clases de caracteres, si desea que un guión se interprete literalmente, debe estar al principio o al final de la clase (o escaparse con una barra invertida). Así que cualquiera de estos funcionará:

[^,;a-zA-Z0-9_-] [^-,;a-zA-Z0-9_] [^a-zA-Z0-9_/-,;]

En cuanto a recortar el final, puede hacer todo esto en un reemplazo de expresiones regulares:

$data = preg_replace(''/[^,;a-zA-Z0-9_-]|[,;]$/s'', '''', $data);


Puede escapar del guión y colocarlo en cualquier lugar de la expresión regular como esto /-

En cuanto a los puntos y comas finales, pruebe esto /[,;]+$/ debe coincidir con cualquier coma y punto y coma al final, incluso si son muchos.