Joyber 发布的文章

正则表达式特殊字符 [:alnum:] 等

如果在"[]"中出现了"^",代表本表达式不匹配"[]"内出现的字符,比如"/[^a-z]/"不匹配任何小写字母!并且正则表达式给出了几种"[]"的默认值,如下:

'[:alnum:]' 匹配任何字母
Alphanumeric characters: '[:alpha:]' and '[:digit:]'.

'[:alpha:]' 匹配任何字母和数字
Alphabetic characters: '[:lower:]' and '[:upper:]'.

'[:blank:]'
Blank characters: space and tab.

'[:cntrl:]'
Control characters. In ASCII, these characters have octal codes 000 through 037, and 177 ('DEL'). In other character sets, these are the equivalent characters, if any.

'[:digit:]' 匹配任何数字
Digits: '0 1 2 3 4 5 6 7 8 9'.

'[:graph:]'
Graphical characters: '[:alnum:]' and '[:punct:]'.

'[:lower:]' 匹配任何小写字母
Lower-case letters: 'a b c d e f g h i j k l m n o p q r s t u v w
x y z'.
'[:print:]'
Printable characters: '[:alnum:]', '[:punct:]', and space.

'[:punct:]' 匹配任何标点符号
Punctuation characters: '! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ' { | } ~'.

'[:space:]' 匹配空格符
Space characters: tab, newline, vertical tab, form feed, carriage
return, and space.

'[:upper:]' 匹配任何大写字母
Upper-case letters: 'A B C D E F G H I J K L M N O P Q R S T U V W
X Y Z'.

'[:xdigit:]' 匹配任何16进制数字
Hexadecimal digits: '0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f'.

For example, '[[:alnum:]]' means '[0-9A-Za-z]', except the latter depends upon the 'C' locale and the ASCII character encoding, whereas the former is independent of locale and character set. (Note that the brackets in these class names are part of the symbolic names, and must
be included in addition to the brackets delimiting the bracket expression.)

[$]方括号内包含的是一个匹配字符范围,前面加上^,即是代表不匹配指定的字符范围。
$ereg代表的是一个变量,即$是变量的标志,这个式子的整体意思就是:
ereg代表的是一个具有以字母开头第二个是字母或数字的所有字符串。

刷新DNS解析

ipconfig /flushdns

查看磁盘分区

#进入 diskpart
diskpart
list disk //列出所有挂在磁盘
sel disk X //选中刚刚自己发现的系统所在磁盘(X自己替换成数字)
lis​​​​​​​t vol​​​​​​​ //查看磁盘里各个盘符,并确定自己的win系统所在的盘符(通常为C盘)
list par //列出上一步所选磁盘的分区,其中就有存放efi的分区,类型为系统,大小几百M
sel par x  //选择efi的分区,x为分区编号
assign letter=o  //为选择的分区分配一个盘符为o以便修复
remove letter=H  #移除分区盘符,H为分区盘符合
exit //退出diskpart,不要关闭命令行框

bcdboot命令修复系统引导

bcdboot x:\windows /s o: /f uefi /l zh-cn  //其中x为确定的window系统盘盘符。
#盘符x:是你自己刚刚确定的盘符,最后的/l是小写的L,不是1

会提示“已成功创建启动文件”。
注意:有的电脑会显示“尝试复制启动文件失败”,如果以上输入没有问题,那么问题在于你的x盘不对,或者说再这个命令行里符号x不代表它。如果显示“尝试复制启动文件失败”,输入exit退出diskpart并使用dir命令判断那个是系统盘。
然后输入exit退出命令行,关机重能进入弄丢的Windows了。

diskpart #运行diskpart工具 隐藏 EFI 分区的方法
有时候系统的EFI分区也显示在资源管理器中,双击提示不能进去,区分大小一般是300M,这就是系统启动分区EFI分区,一般情况下是看不见的,如果你能看见说明系统经过了某些操作才会如此,现在可以按以下操作,不让这个系统分区展示出来。

打开cmd或powershell,按如下命令行操作(以powershell示例,#及后面文字为注释内容不需要输入):

diskpart  #运行diskpart工具
lis dis  #列出所有磁盘
sel dis 2  #选中u盘,视你的磁盘大小判断选择数字,2是我的u盘
lis par  #列出所有分区
sel par 2  #选中efi分区,视你的分区大小判断选择,2是我的efi分区
detail par  #查看该分区详细信息

#如果在磁盘管理器中看不到可以显示出来的
#set id=06  #取消分区隐藏,如果是1b或1c就改成0b或0c,执行该命令后磁盘管理中就能看到efi盘符了

#这里在LTR一列可以看到分配的盘符,我这里是H,区分大小写的
remove letter=H  #移除分区盘符,视你的efi分区盘符选择

#设置回隐藏的
#set id=16  #分区类型改回隐藏

1705558696616.jpg

EFI分区文件结构(仅说明3个必要文件)

(EFI分区)..................此分区必须为Fat32格式,不然UEFI固件将无法识别
|
+--EFI
  |--Microsoft
  |  +--Boot
  |     |--bootmgfw.efi...一个针对Windows的efi应用,使Boot Menu界面上的Windows Boot Manager可以工作
  |     +--BCD............启动配置文件,用户编辑启动菜单以及默认的启动顺序等
  |--Boot
      +--bootx64.efi.......一个针对UEFI的统一efi应用,可以针对所有的系统。如果是32位系统,则是boota32.ef

引导流程

                                     计算机加电
                                        |
                                      BIOS自检
                                        |
                                    UEFI固件启动
                                        |
                        根据NVRAM下的BootOrder顺序加载启动设备
                                        |
              获取对应启动设备下第一个存有正确efi应用的Fat32格式分区并加载
                                        |
                            读取efi应用信息,加载到BCD文件
                                        |
读取BCD文件下的记录以加载系统,默认Windows10系统是加载C:\Windows\System32\winload.efi应用
                                        |
                  接下来就交给系统服务了。这样子就完成了系统的启动过程

说明一下:

什么叫做根据NVRAM下的BootOrder顺序加载启动设备,这个里面有几个知识点

NVRAM(非易失性存储器) 是BIOS用于存储本计算机启动设备信息的载体,可以通过 bcdedit /enum firmware 来查看信息,参考 这个

BootOrder 顾名思义就是一个引导顺序,可以在BIOS下调节,比如先引导Windows Boot Manager还是先引导ATA HDD0这个设备

什么叫做获取对应启动设备下第一个存有正确efi应用的Fat32格式分区并加载?正常情况来说,一个硬盘分区仅有一个Fat32格式的EFI分区,并且往往是在第一个,但是当出现多了EFI分区那么UEFI固件将如何加载呢?对于首选启动已经设置为了Windows Boot Manager的情况下可以忽略,因为这个里面已经明确定义了加载哪块硬盘的哪个分区下哪个文件。当没有这个Windows Boot Manager项目而只能通过ATA HDDX下的分区查找时,经测试。会加载上可识别的拥有正确efi应用(位置: (EFI_Partition)EFIBootbootx64.efi )的第一个EFI分区,并根据efi应用的信息加载对应的BCD文件。

So,总结如下。可以没有 (EFI_Partition)EFIBootbootx64.efi ,也可以没有: (EFI_Partition)EFIMicrosoftBootbootmgfw.efi ,但是不能2个同时没有,存在 (EFI_Partition)EFIBootbootx64.efi 的情况下,可以在BIOS的Boot Menu界面选择ATA HDDX启动,存在 (EFI_Partition)EFIMicrosoftBootbootmgfw.efi 并设置正确的情况下,可以在BIOS的Boot Menu界面上选择 Windows Boot Manager启动。

说几个关于引导的命令
mountvol 用于加载分区,比如 mountvol K: /s 加载默认的EFI分区到K盘

bcdboot 用于修复efi文件,比如 bcdboot C:Windows /l en-us 将同时修复 (EFI_Partition)EFIBootbootx64.efi 和 (EFI_Partition)EFIMicrosoftBootbootmgfw.efi 2个文件

bootrec 可用于重新创建BCD文件,比如 bootrec /rebulidbcd 会在默认的位置 (EFI_Partition)EFIMicrosoftBoot 重新生成识别到的系统的BCD文件

bcdedit 用于编辑BCD文件

如果安装了双系统,不小心把WIN系统的引导删除了怎么恢复:
需要有PE系统,没有可以自己制作一个,这里不展开了
进去PE系统后修复BCD,以U启通PE为例:进入安装界面,点击左下角修复计算机。依次点击:“疑难解答”,“高级选项”,“命令提示符”。进入CMD命令 接下来依次输入

diskpart
list disk //列出所有挂在磁盘
sel disk X //选中刚刚自己发现的系统所在磁盘(X自己替换成数字)
lis​​​​​​​t vol​​​​​​​ //查看磁盘里各个盘符,并确定自己的win系统所在的盘符(通常为C盘)
list par //列出上一步所选磁盘的分区,其中就有存放efi的分区,类型为系统,大小几百M
sel par x  //选择efi的分区,x为分区编号
assign letter=o  //为选择的分区分配一个盘符为o以便修复
exit //退出diskpart,不要关闭命令行框

4077bec5accc431db430a3659d709633.png
bcdboot命令进行修复
命令行使用bcdboot命令,大概但不是下面这样
这里的c:不一定是系统盘,需要用dir命令列出盘内文件来自己判断哪个才是系统盘,dir c: 和 dir d: 等,记住系统盘是哪个。
046ffeb9e06742c19fc4d95e938e4b33.png
然后执行bcdboot命令:
最后输入

bcdboot x:\windows /s o: /f uefi /l zh-cn  //其中x为亲自判断的系统盘盘符。
#盘符x:是你自己刚刚确定的盘符,最后的/l是小写的L,不是1

会提示“已成功创建启动文件”。

注意:有的电脑会显示“尝试复制启动文件失败”,如果以上输入没有问题,那么问题在于你的x盘不对,或者说再这个命令行里符号x不代表它。
如果显示“尝试复制启动文件失败”,输入exit退出diskpart并使用dir命令判断那个是系统盘。

然后输入exit退出命令行,关机重能进入弄丢的Windows了。

终于大功告成

小结
到目前为止是windows进去了但是我最初的目的还没达到阿,就是切换双系统。其实在这个折腾的过程中我已经解决了,下面来唠唠上面说的蠢的过程:
首先第一张图的系统选择页面是由ubuntu系统设置的开机引导页面供自己选择进入哪个系统,而我当时忘记了,所以就开始准备在windows系统里面准备设置开机引导来供选择进入哪个系统,最后没有成功还把windows搞得进不去了。原理上应该是可行了,两个系统之间的切换只需修改一个系统的开机引导选择就行了,而我已经在ubuntu里面设置了(具体设置可以参考这里),至于为什么没有开机的时候进入这个选择的页面是因为,BIOS里面把windows作为最先启动的了,所以以前开机直接就进windows了,没有出现选择的页面。当我把BIOS启动优先级改成了ubuntu最先启动,这时就会出现选择系统的页面了,然后选择就好了,就这么简单。

PHP易错点

<?php

//空格会被判断为真
var_dump(!!'0'); //false
var_dump(!!' '); //true,空格会被判断为真