Detectar caracteres remotos en PHP -- php campo con regex campo con encoding campo con preg-match camp Relacionados El problema

Detect remote charset in php


0
vote

problema

Español

Me gustaría determinar la codificación de una página remota a través de la detección de la etiqueta de encabezado

tipo de contenido
  <meta http-equiv="Content-Type" content="text/html; charset=XXXXX" />   

si está presente.

Recupere la página remota e intente hacer una regla de referencia para encontrar la configuración requerida si está presente. Todavía estoy aprendiendo de ahí el problema a continuación ... Aquí está lo que tengo:

      $EncStart = 'charset=';     $EncEnd = '" />';     preg_match( "/$EncStart(.*)$EncEnd/s", $RemoteContent, $RemoteEncoding );     echo = $RemoteEncoding[ 1 ];   

El anterior hace eco del nombre de la codificación, pero no sabe dónde detenerlo, por lo que imprime el resto de la línea, la mayor parte del resto de la página remota en mi prueba. Ejemplo: al probar una página rusa remota imprimió:

Windows-1251 "/ & gt;
Resto de la página ....

Lo que significa que $EncStart estaba bien, pero la parte 9988777663 de la regex no se detuvo en la coincidencia. Este encabezado meta generalmente termina en 3 posibilidades diferentes después del nombre de la codificación.

  "> | "/> | " />   

No sé el clima Esto es usable para satisfacer el final de la mecanización y, en caso afirmativo, cómo escapar de ella. Jugué con diferentes formas de hacerlo, pero ninguna trabajó.

Gracias de antemano por prestar una mano.

Original en ingles

I would like to determine a remote page's encoding through detection of the Content-Type header tag

<meta http-equiv="Content-Type" content="text/html; charset=XXXXX" /> 

if present.

I retrieve the remote page and try to do a regex to find the required setting if present. I am still learning hence the problem below... Here is what I have:

    $EncStart = 'charset=';     $EncEnd = '" \/\>';     preg_match( "/$EncStart(.*)$EncEnd/s", $RemoteContent, $RemoteEncoding );     echo = $RemoteEncoding[ 1 ]; 

The above does indeed echo the name of the encoding but it does not know where to stop so it prints out the rest of the line then most of the rest of the remote page in my test. Example: When testing a remote russian page it printed:

windows-1251" />
rest of page ....

Which means that $EncStart was okay, but the $EncEnd part of the regex failed to stop the matching. This meta header usually ends in 3 different possibility after the name of the encoding.

"> | "/> | " /> 

I do not know weather this is usable to satisfy the end of the maching and if yes how to escape it. I played with different ways of doing it but none worked.

Thank you in advance for lending a hand.

           
       
       

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 

Agregar un signo de interrogación a su patrón para que no sea codicioso (y tampoco hay necesidad de 's')

  preg_match( "/charset="(.+?)"/", $RemoteContent, $RemoteEncoding ); echo $RemoteEncoding[ 1 ];   

Tenga en cuenta que esto no manejará charset = "..." o for elem in array: count[elem] = count.get(elem, 0) + 1 for elem, elem_count in count.items(): if 0.20 <= float(elem_count) / len(array) <= 0.25: print "{} has a frequency between 20% and 25%".format(elem) 0 y muchas otras combinaciones.

 

add a question mark to your pattern to make it non-greedy (and there's also no need of 's')

preg_match( "/charset=\"(.+?)\"/", $RemoteContent, $RemoteEncoding ); echo $RemoteEncoding[ 1 ]; 

note that this won't handle charset = "..." or charset='...' and many other combinations.

 
 
 
 
0
 
vote

Eche un vistazo a Simple HTML Dom Parser . Con él, puede encontrar fácilmente el accidente de la cabeza sin recurrir a regiones engorrosas. Pero como ya comentó David, también debe examinarlo los encabezados para el La misma información y prioricelo si se encuentra.

Ejemplo probado:

  for elem in array:     count[elem] = count.get(elem, 0) + 1 for elem, elem_count in count.items():     if 0.20 <= float(elem_count) / len(array) <= 0.25:         print "{} has a frequency between 20% and 25%".format(elem) 111  
 

Take a look at Simple HTML Dom Parser. With it, you can easily find the charset from the head without resorting to cumbersome regexes. But as David already commented, you should also examine the headers for the same information and prioritize it if found.

Tested example:

require_once 'simple_html_dom.php';  $source = file_get_contents('http://www.google.com'); $dom = str_get_html($source); $meta = $dom->find('meta[http-equiv=content-type]', 0); $src_charset = substr($meta ->content, stripos($meta ->content, 'charset=') + 8);  foreach ($http_response_header as $header) {     @list($name, $value) = explode(':', $header, 2);     if (strtolower($name) == 'content-type') {         $hdr_charset = substr($value, stripos($value, 'charset=') + 8);         break;     } }  var_dump(     $hdr_charset,     $src_charset ); 
 
 
 
 

Relacionados problema

7  ADVERTENCIA: PREG_MATCH () [Function.Preg-coincidencia]: modificador desconocido '/' [duplicado]  ( Warning preg match function preg match unknown modifier ) 
Esta pregunta ya tiene respuestas aquí : ADVERTENCIA: PREG_REPLOSE (): modificador desconocido ...

2  PHP Patrón de expresión regular permite asteriscos literales no deseados  ( Php regular expression pattern allows unwanted literal asterisks ) 
Tengo una expresión regular que permite solo caracteres específicos de los campos de nombre en un formulario HTML, a saber, letras, espacio en blanco, citas i...

0  ¿Cómo puedo hacer un regeo para asignar valores de cadena en la matriz recursivamente?  ( How can i make a regex to assign string values on array recursively ) 
Quiero analizar una cuerda como un código corto que puede tener o no las variables, y poner estas variables en una matriz. El texto dado es: Lorem IPSUM Do...

0  convertir la URL al hipervínculo en el texto como formateado  ( Convert url to hyperlink on text as formatted ) 
Estoy usando el siguiente código para convertir la URL en el hipervínculo en texto. Pero el problema es que quiero usar el título de acortar para el hipervínc...

4  Php preg_match cualquier personaje excepto la palabra [duplicado]  ( Php preg match any character except word ) 
Esta pregunta ya tiene respuestas aquí : expresión regular para que coincida con una línea que no co...

0  Cómo encontrar el lugar de los dígitos en una cadena en PHP  ( How to find the place of digits in a string in php ) 
Quiero encontrar el lugar de una subcadena basada en el dígito en una cadena como FILE|3 He intentado FILE|4 como FILE|5 Pero encuentra FILE|6 ...

1  Tratando de encontrar Twitter RT's con expresiones regulares y PHP  ( Trying to find twitter rts with regular expressions and php ) 
Estoy tratando de encontrar la expresión regular correcta para que coincida con todos los escenarios de RT en Twitter (no puedo esperar a la nueva API retweet...

0  ¿Cómo obtengo enlaces de Href = "Animals.HTML" en PHP DOM?  ( How do i get links from href animals html in php dom ) 
Mis páginas son www.example.com/somthing/types.html, www.example.com/somthing2/types.html Este archivo HTML tiene una etiqueta <a href="animals.html" . somth...

46  PHP PREG_MATCH y PREG_MATCH_ALL FUNCIONES  ( Php preg match and preg match all functions ) 
Me gustaría saber cuál es el (Set<Integer> odds = new HashSet<>(ints)).removeAll(evens); // doesn't compile 2 y (Set<Integer> odds = new HashSet<>(ints)).r...

2  Regex con paréntesis  ( Regex with brackets ) 
Estoy buscando ayuda con la regex. Tengo este pedazo de código: conda list 3 que funciona bien. Sin embargo, el siguiente no: conda list 4 El me...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos