为什么 preg_replace('/(cd)/',strtoupper("$1"),'abcdeaaacdf');运行之后被替换的的字符串没有转成大写呢?strtoupper()函数不是先把那些字符串转成大写再替换吗?如果说strtoupper()在转大写的时候,那些子 模式还没有值,然后优先级轮到preg_replace()函数去运行替换的时候,它的第二个参数不是依靠strtoupper()的返回值的吗?如果此时strtoupper()已经不再运行没有值返回,那为何最后preg_replace()运行结束的时 候网页还会打印出字符串?而不是空值或者提示出错?
时间: 2024-02-09 12:07:40 浏览: 29
preg_replace() 函数的第二个参数是一个字符串或一个数组,当它是一个字符串时,会将匹配到的子模式替换成该字符串;当它是一个数组时,会按顺序将匹配到的子模式替换成数组元素。在你的代码中,第二个参数是一个字符串,它是在函数调用之前就被处理好了,因此并不依赖于 preg_replace() 函数。所以即使子模式中的字符串未被转换为大写,preg_replace() 函数也会将它们替换成指定的字符串。最终输出的结果是:abCDeaaaCDF。
相关问题
preg_replace('/(cd)/',strtoupper("123$1yyy"),'abcdeaaacdf');这句代码preg_replace()的第二个参数是哪里来的,不是来自strtoupper()的返回值吗?而这个返回值不是空的吗?为何最后preg_replace()返回的字符串是“ab123cdYYYeaaa123cdYYYf”,而不是“abeaaaf”呢?
preg_replace()的第二个参数是一个字符串,其中包含替换后的内容和可选的反向引用序列。在这个例子中,第二个参数是一个包含了替换后的内容和反向引用序列“123$1yyy”的字符串。其中,“123”是替换后的内容,“$1”是表示第一个括号匹配到的内容,也就是“cd”,因为它在正则表达式中的位置是“(cd)”。“yyy”是替换后的内容。
因此,当preg_replace()函数应用于字符串“abcdeaaacdf”时,它会找到所有匹配正则表达式“(cd)”的子字符串,并将其替换为“123cdyyy”。因此,结果字符串是“ab123cdYYYeaaa123cdYYYf”,而不是“abeaaaf”。
<?php $allow_ext = array('png','jpg','gif'); $file = $_FILES['file']['name']; $file_info = pathinfo($file); var_dump($file_info); $file_ext = $file_info['extension']; if(!in_array($file_ext, $allow_ext)){ exit("error extension"); } $news = time(); $filepath = './uploads/'; $newname = md5(md5($news)).'.'.$file_ext; $tmp_name=$_FILES['file']['tmp_name']; $filename=$filepath.$newname; if(move_uploaded_file($tmp_name,$filename)) { $content = file_get_contents($filename); $content = preg_replace('/<\?php|\?>/i', '_', $content); $content = preg_replace('/php/i', '', $content); $content = preg_replace('/eval/i', '_', $content); $content = preg_replace('/assert/i', '_', $content); $content = preg_replace('/ev/i', '_', $content); $content = preg_replace('/system/i', '_', $content); $content = preg_replace('/as/i', '_', $content); $content = preg_replace('/call/i', '_', $content); $content = preg_replace('/replace/i', '_', $content); $content = preg_replace('/func/i', '_', $content); file_put_contents($filename, $content); $data['success'] = 1; $data['message'] = 'æˆåŠŸ'; $data['url'] = $filename; }else{ $data['message']='ä¸Šä¼ å¤±è´¥!'; } echo json_encode($data); ?>
这段代码是一个 PHP 文件上传的示例。它首先定义了允许上传的文件扩展名数组 `$allow_ext`,然后通过 `$_FILES` 数组获取上传文件的原始名称,并使用 `pathinfo()` 函数获取文件信息。接下来,它将获取到的文件扩展名与允许的扩展名进行比较,如果不在允许的范围内,则输出 "error extension" 并终止程序。
如果文件扩展名允许上传,则会生成一个新的文件名 `$newname`,这里使用了时间戳和 MD5 哈希来生成唯一的新文件名,并将其保存在指定的文件夹路径 `$filepath` 中。
然后,它使用 `move_uploaded_file()` 函数将临时文件移动到指定的路径中。接下来,它会读取上传文件的内容,并使用一系列正则表达式替换操作来过滤一些敏感关键词(如 PHP 标签、eval、assert 等),并将过滤后的内容重新写入文件。
最后,它会将上传结果以 JSON 格式输出,包含成功标识 `success`、消息 `message` 和上传文件的 URL `url`。
需要注意的是,这段代码仅用于演示上传过程,并没有涉及其他安全性措施,例如对上传文件的类型、大小、目录权限等进行验证和限制。在实际应用中,需要根据具体需求和安全考虑添加相应的验证和过滤机制。