Pregunta

Así que tengo un problema interesante: tengo una cadena, y en su mayor parte sé qué esperar:

http://www.someurl.com/st= ?????? ??

Salvo en este caso, los? 'S son letras o números en mayúsculas. El problema es que la cadena tiene en la basura mezclada: la cadena se divide en 5 o 6 piezas, y en el medio hay un montón de chatarra: caracteres no imprimibles, personajes extranjeros, así como caracteres normales llanura de edad. En pocas palabras, cosas que son propensos a tener este aspecto: Nyth = mî; Emy × nüqÏ

Por lo general, los últimos 8 caracteres (la? 'S) son junto a la derecha al final, por lo que en este momento sólo tengo PHP agarrar los últimos 8 caracteres y esperar lo mejor. De vez en cuando, eso no funciona, por lo que necesitan una solución más robusta.

El problema es técnicamente imposible de resolver, pero creo que la mejor solución es tomar personajes de la final de la cadena mientras están en mayúsculas o numérico. Si consigo 8 o más, se supone que es correcto. De lo contrario, encontrar el st = y personajes de agarre en el futuro a todos los que necesito para llenar la cuota de 8 caracteres. ¿Hay una manera de expresiones regulares para hacer esto o voy a tener que subirse las mangas y seguir el estilo de bucle anidado?

Actualización:

Para aclarar cierta confusión, consigo una cadena de entrada que es como sigue:

[garbage]http:/[garbage]/somewe[garbage]bsite.co[garbage]m/something=[garbage]????????

excepto la basura es en lugares impredecibles en la cadena (excepto el fin nunca es basura), y tiene una longitud impredecible (por lo menos, he sido capaz de encontrar patrones en ninguno). ? Por lo general, los s están todos juntos por lo tanto, yo sólo sacar los últimos 8 caracteres, pero a veces no son lo que se traduce en algunos datos que faltan y volvieron basura: - \

¿Fue útil?

Solución

$var = '†http://þ=www.ex;üßample-website.î;ëcomÝ×ü/joy_hÏere.html'; // test case

$clean = join(
    array_filter(
        str_split($var, 1),
        function ($char) {
            return (
                array_key_exists(
                    $char,
                    array_flip(array_merge(
                        range('A','Z'),
                        range('a','z'),
                        range((string)'0',(string)'9'),
                        array(':','.','/','-','_')
                    ))
                )
            );
        }
    )
);

¡Ah, que era una broma. He aquí una expresión regular para usted:

$clean = preg_replace('/[^A-Za-z0-9:.\/_-]/','',$var);

Otros consejos

Como se dijo, el problema es irresoluble. Si la basura puede contener "viejos caracteres normales de civil" caracteres, y la basura puede caer en el extremo de la cadena, entonces no se puede saber si la cadena objetivo de esta muestra es "ABCDEFGH" o "BCDEFGHI":

__http:/____/somewe___bsite.co____m/something=__ABCDEFGHI__

¿Qué representan estos valores? Si desea conservar todos de la misma, solo que sin tener que lidiar con la basura en su base de datos, tal vez debería hechizar a codificar usando bin2hex () .

Puede utilizar esta expresión regular:

Si (preg_match ( '/ [\' ^ £ $% & * () {} @ # ~> <>, |? = _ + ¬ -] /', $ cadena) == 1)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top