题
所以我有一个有趣的问题:我有一串,并为大部分我知道什么期望:
http://www.someurl.com/st=????????
除了在这种情况下,?'s要么是上写字母或数字。问题是,串有生活垃圾混在:串分为5个或6个,而在之间有很多的垃圾:不可打印的字符,外国文字,以及普通老正常的人物。在短期,东西这很容易这样的:Nyþ=mî;ëMÝ×nüqÏ
通常的最后一个8字符的(?'s)的一起正在结束,这样的时刻我只是有PHP抓住最后一个8字,并最好的希望。偶尔,这并不工作,所以我需要一个更强大的解决方案。
问题在技术上是无法解决的,但我认为最好的解决办法是要抓住字从结束串的同时,他们上的情况或数字。如果我得到8个或更多,假设是正确的。否则,找到st=并抓住人物向前发展的许多作为我需要填补的8个字符的配额。是否有一个regex的方式做到这一点,或者将需要我卷起我的袖子和转嵌套循环的风格?
更新:
要澄清一些混淆,我得到一个输入串就是这样的:
[garbage]http:/[garbage]/somewe[garbage]bsite.co[garbage]m/something=[garbage]????????
除了这垃圾是在不可预测在字符串中的位置(除端从来没有垃圾),并且具有不可预测的长度(至少,我已经能够找到的模式在这两).通常?s都在一起,因此我刚刚抓住的最后一个8字,但有时他们不是它的结果在某些缺失的数据和返回的垃圾:-\
解决方案
$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(':','.','/','-','_')
))
)
);
}
)
);
哈,那是一个笑话。这里有一个regex你:
$clean = preg_replace('/[^A-Za-z0-9:.\/_-]/','',$var);
其他提示
如上所述,问题是无法解决的。如果垃圾可以包含"普通的老式正常人物"的人物,而垃圾可能落在最后的string,然后你不知道是否该目标串从这个样本中是"ABCDEFGH"或"BCDEFGHI":
__http:/____/somewe___bsite.co____m/something=__ABCDEFGHI__
什么做这些价值代表什么?如果你想要保留所有它,就没有必要处理垃圾数据库中,也许你应该进制编码就使用 bin2hex().
你可以使用这个规则的表达:
if(preg_match('/[\'^£$%&*()}{@#~?><>,|=_+-]/', $string)==1)