rawurlencode online ejemplo php testing url-encoding

online - urlencode php ejemplo



Probar si la cadena es URL codificada en PHP (11)

Aquí hay algo que acabo de poner juntos.

if ( urlencode(urldecode($data)) === $data){ echo ''string urlencoded''; } else { echo ''string is NOT urlencoded''; }

¿Cómo puedo probar si una cadena está codificada en URL?

¿Cuál de los siguientes enfoques es mejor?

  • Busque en la cadena los caracteres que se codificarán, los que no, y si existen, no están codificados, o
  • Usa algo como esto que he hecho:

function is_urlEncoded($string){ $test_string = $string; while(urldecode($test_string) != $test_string){ $test_string = urldecode($test_string); } return (urlencode($test_string) == $string)?True:False; } $t = "Hello World > how are you?"; if(is_urlEncoded($sreq)){ print "Was Encoded./n"; }else{ print "Not Encoded./n"; print "Should be ".urlencode($sreq)."/n"; }

El código anterior funciona, pero no en los casos en que la cadena se ha codificado doblemente, como en estos ejemplos:

  • $t = "Hello%2BWorld%2B%253E%2Bhow%2Bare%2Byou%253F";
  • $t = "Hello+World%2B%253E%2Bhow%2Bare%2Byou%253F";

Bueno, el término "url codificado" es un poco vago, tal vez un simple chequeo de expresiones regulares funcionará.

$is_encoded = preg_match(''~%[0-9A-F]{2}~i'', $string);


Creo que no hay una manera infalible de hacerlo. Por ejemplo, considere lo siguiente:

$t = "A+B";

¿Es esa una URL codificada como "AB" o debe estar codificada como "A% 2BB"?


El código @ user187291 funciona y solo falla cuando + no está codificado.

Sé que este es un post muy antiguo. Pero esto me funcionó.

$is_encoded = preg_match(''~%[0-9A-F]{2}~i'', $string); if($is_encoded) { $string = urlencode(urldecode(str_replace([''+'',''=''], [''%2B'',''%3D''], $string))); } else { $string = urlencode($string); }


Estoy usando la siguiente prueba para ver si las cadenas se han codificado con url:

if(urlencode($str) != str_replace([''%'',''+''], [''%25'',''%2B''], $str))

Si una cadena ya ha sido urlencodificada, los únicos caracteres que cambiarán por codificación doble son% (que inicia todas las cadenas de caracteres codificados) y + (que reemplaza espacios). Vuelva a cambiarlos y debería tener la cadena original.

Hazme saber si esto funciona para ti.


No hay una forma confiable de hacerlo, ya que hay cadenas que permanecen igual durante el proceso de codificación, es decir, ¿está "abc" codificado o no? No hay una respuesta clara. Además, como te has encontrado, algunos personajes tienen varias codificaciones ... Pero ...

Su esquema de decodificación-verificación-codificación-verificación falla debido a que algunos caracteres pueden estar codificados de más de una manera. Sin embargo, una ligera modificación en su función debería ser bastante confiable, solo verifique si la decodificación modifica la cadena, si lo hace, fue codificada.

Por supuesto, no será infalible, ya que "10 + 20 = 30" devolverá verdadero (+ se convierte en espacio), pero en realidad solo estamos haciendo aritmética. Supongo que esto es lo que tu plan intenta contrarrestar, lamento decir que no creo que haya una solución perfecta.

HTH.

Editar:
Como indiqué en mi propio comentario (solo reiterando aquí para mayor claridad), un buen compromiso probablemente sería verificar si hay caracteres no válidos en su URL (por ejemplo, espacio), y si hay algunos no está codificado. Si no hay ninguno, intente decodificar y ver si la cadena cambia. Esto aún no manejará la aritmética anterior (lo cual es imposible), pero es de esperar que sea suficiente.


Nunca sabrá con seguridad si una cadena está codificada en URL o si se suponía que tenía la secuencia %2B . En su lugar, es probable que dependa de dónde vino la cadena, es decir, si fue hecha a mano o de alguna aplicación.

¿Es mejor buscar en la cadena caracteres que se codificarían, cuáles no, y si existe alguno, entonces no está codificado?

Creo que este es un enfoque mejor, ya que se encargaría de las cosas que se han hecho mediante programación (suponiendo que la aplicación no hubiera dejado atrás un carácter no codificado).

Una cosa que será confusa aquí ... Técnicamente, el % "debe ser" codificado si estará presente en el valor final, ya que es un carácter especial. Es posible que tenga que combinar sus enfoques para buscar caracteres codificados, así como validar que la cadena se decodifique correctamente si no se encuentra ninguno.


Qué pasa:

if (urldecode(trim($url)) == trim($url)) { $url_form = ''decoded''; } else { $url_form = ''encoded''; }

¿No funcionará con doble codificación pero esto está fuera del alcance, supongo?


Tengo un truco:

Puedes hacer esto para evitar que se codifique doblemente. Cada vez que decodifiques primero, codifica de nuevo;

$string = urldecode($string);

Entonces hazlo de nuevo

$string = urlencode($string);

De esta manera podemos evitar la doble codificación :)


envía una variable que marca la decodificación cuando ya obtienes datos de una URL.

?path=folder/new%20file.txt&decode=1


privado booleano estático isEncodedText (String val, String ... encoding) lanza UnsupportedEncodingException {String decodedText = URLDecoder.decode (val, TransformFetchConstants.DEFAULT_CHARSET);

if(encoding != null && encoding.length > 0){ decodedText = URLDecoder.decode(val, encoding[0]); } String encodedText = URLEncoder.encode(decodedText); return encodedText.equalsIgnoreCase(val) || !decodedText.equalsIgnoreCase(val); }