所以我有一个有趣的问题:我有一个字符串,而且大多数情况下我知道会发生什么:
http://www.someurl.com/st= ????????
除非在这种情况下,?是大写字母或数字。问题是,字符串有垃圾混合:字符串分为5或6个,中间有很多垃圾:不可打印的字符,外来字符,以及普通的旧普通字符。简而言之,看起来像这样的东西:Nyþ=mî;ëMÝ×nüqÏ
通常最后8个字符(?)最后都在一起,所以目前我只有PHP抓住最后8个字符并希望最好。偶尔,这不起作用,所以我需要一个更强大的解决方案。
问题在技术上是无法解决的,但我认为最好的解决方案是从字符串末尾抓取字符,而它们是大写或数字。如果我得到8或更多,假设是正确的。否则,找到st =并抓取前进的字符,尽可能多地填写8个字符的配额。是否有正则表达式方法可以做到这一点,还是我需要卷起袖子并采用嵌套循环风格?
更新
为了消除一些困惑,我得到一个类似这样的输入字符串:
[garbage]http:/[garbage]/somewe[garbage]bsite.co[garbage]m/something=[garbage]????????
除了垃圾是在字符串中不可预测的位置(除了结尾永远不是垃圾),并且具有不可预测的长度(至少,我已经能够找到两者中的模式)。通常情况下,这些都在一起,因此我只抓住最后8个字符,但有时它们不会导致一些丢失的数据并返回垃圾: - \
答案 0 :(得分:6)
$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(':','.','/','-','_')
))
)
);
}
)
);
哈,这是个玩笑。这是你的正则表达式:
$clean = preg_replace('/[^A-Za-z0-9:.\/_-]/','',$var);
答案 1 :(得分:1)
如上所述,问题无法解决。如果垃圾可以包含“普通旧普通字符”字符,并且垃圾可以落在字符串的末尾,那么您无法知道此样本中的目标字符串是“ABCDEFGH”还是“BCDEFGHI”:
__http:/____/somewe___bsite.co____m/something=__ABCDEFGHI__
答案 2 :(得分:0)
这些值代表什么?如果你想保留所有这些,只需要不必处理数据库中的垃圾,也许你应该使用bin2hex()进行十六进制编码。
答案 3 :(得分:0)
您可以使用此正则表达式:
if(preg_match('/ [\'^£$%& *()} {@#〜?><>,| = _ +¬ - ] /',$ string)== 1 )