Domanda

Così ho un problema interessante: ho una stringa, e per la maggior parte i brutte sorprese:

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

Tranne che in questo caso, i s? 'Sono sia lettere maiuscole o numeri. Il problema è, la stringa ha spazzatura mescolati: la stringa è suddiviso in 5 o 6 pezzi, e in mezzo c'è un sacco di spazzatura: caratteri non stampabili, personaggi stranieri, così come caratteri normali vecchi pianura. Insomma, roba che è suscettibile di simile a questa: Nyth = mi, Emy × nüqÏ

Di solito gli ultimi 8 caratteri (il? 'S) sono insieme proprio alla fine, quindi al momento devo solo PHP afferrare gli ultimi 8 caratteri e sperare per il meglio. Di tanto in tanto, che non funziona, quindi ho bisogno di una soluzione più robusta.

Il problema è tecnicamente irrisolvibile, ma che la soluzione migliore è quella di afferrare caratteri dalla fine della stringa mentre sono minuscole o numerico. Se ottengo 8 o più, si supponga che è corretto. In caso contrario, trovare la st = e personaggi afferrare andando avanti come molti come ho bisogno di riempire la quota di 8 caratteri. C'è un modo regex per fare questo o avrò bisogno di rimboccarsi le maniche e andare stile nidificato-ciclo?

Aggiornamento:

Per chiarire una certa confusione, ottengo una stringa di input che è in questo modo:

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

tranne la spazzatura è in luoghi imprevedibili nella stringa (tranne la fine non è mai spazzatura), e ha la lunghezza imprevedibile (almeno, sono stato in grado di trovare modelli in nessuno dei due). ? Di solito i s sono tutti insieme, quindi, mi ha appena afferrando gli ultimi 8 caratteri, ma a volte non sono che si traduce in alcuni dati mancanti e restituiti spazzatura: - \

È stato utile?

Soluzione

$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, che era uno scherzo. Ecco una regex per voi:

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

Altri suggerimenti

Come già detto, il problema è irrisolvibile. Se la spazzatura può contenere "plain vecchi personaggi normali" personaggi, e la spazzatura può cadere alla fine della stringa, quindi non si può sapere se la stringa di destinazione da questo campione è "ABCDEFGH" o "BCDEFGHI":

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

Cosa significano questi valori rappresentano? Se si desidera mantenere tutto questo, solo, senza avere a che fare con la spazzatura nel database, forse si dovrebbe HEX-codificare utilizzando BIN2HEX () .

È possibile utilizzare questa espressione regolare:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top