php expression régulière pour filtrer les pourriels
Question
J'ai donc un problème intéressant: je une chaîne, et pour la plupart je sais à quoi vous attendre:
http://www.someurl.com/st= ?????? ??
Sauf dans ce cas, les? 'S sont soit des lettres majuscules ou chiffres. Le problème est, la chaîne a déchets mélangés: la chaîne est divisée en 5 ou 6 morceaux, et entre il y a beaucoup de malbouffe: caractères non imprimables, des caractères étrangers, ainsi que de vieux caractères normaux simples. Bref, des choses qui est susceptible de ressembler à ceci: Nyth = mî; Emy × nüqÏ
En général, les 8 derniers caractères (le? S) sont ensemble juste à la fin, donc au moment où je viens de PHP saisir les 8 derniers caractères et de l'espoir pour le meilleur. De temps en temps, cela ne fonctionne pas, donc je besoin d'une solution plus robuste.
Le problème est techniquement impossible à résoudre, mais je pense que la meilleure solution est de saisir les caractères de la fin de la chaîne alors qu'ils sont le cas ou le format numérique. Si je reçois 8 ou plus, supposons que cela est exact. Dans le cas contraire, trouver le st = et caractères d'appui aller de l'avant autant que je dois remplir le quota de 8 caractères. Est-il possible de le faire regex ou dois-je me retrousser les manches et aller style boucle imbriquée?
Mise à jour:
Pour éclaircir une certaine confusion, je reçois une chaîne d'entrée qui est comme ceci:
[garbage]http:/[garbage]/somewe[garbage]bsite.co[garbage]m/something=[garbage]????????
sauf les ordures sont dans des endroits imprévisibles de la chaîne (sauf la fin est jamais ordures), et a une longueur imprévisible (au moins, je suis en mesure de trouver des modèles dans aucun des deux). ? En général, les s sont tous ensemble moi donc tout simplement saisissant les 8 derniers caractères, mais parfois ils ne sont pas ce qui se traduit par des données manquantes et les déchets retournés: - \
La solution
$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(':','.','/','-','_')
))
)
);
}
)
);
Hah, qui était une blague. Voici une regex pour vous:
$clean = preg_replace('/[^A-Za-z0-9:.\/_-]/','',$var);
Autres conseils
Comme indiqué, le problème est insoluble. Si la poubelle peut contenir « bon vieux caractères normaux » caractères, et les ordures peut tomber à la fin de la chaîne, alors vous ne pouvez pas savoir si la chaîne cible de cet échantillon est « ABCDEFGH » ou « BCDEFGHI »:
__http:/____/somewe___bsite.co____m/something=__ABCDEFGHI__
Qu'est-ce que ces valeurs représentent-ils? Si vous souhaitez conserver tout cela, juste sans avoir à traiter avec les ordures dans votre base de données, peut-être vous devriez jeter un sort-encoder à l'aide bin2hex () .
Vous pouvez utiliser cette expression régulière:
if (preg_match ( '/ [\' ^ £ $% & * ()} {@ # ~> <>, |? = _ + ¬ -] / », $ string) de == 1)