所以,我有一个带有如下行的html文件:
<script data-cfasync="false" type="text/javascript"> fid="RandonString"; v_width=620; v_height=490;</script>
我的任务是找到fid="RandomString"并将 "" 之间的所有内容复制到文本文件中,而无需使用任何外部软件。RandonString 的长度为 2-100 个字符。
所以,我有一个带有如下行的html文件:
<script data-cfasync="false" type="text/javascript"> fid="RandonString"; v_width=620; v_height=490;</script>
我的任务是找到fid="RandomString"并将 "" 之间的所有内容复制到文本文件中,而无需使用任何外部软件。RandonString 的长度为 2-100 个字符。
这并不难,这里有一个 5 行的解决方案:
set "x=<script data-cfasync="false" type="text/javascript"> fid="RandonString"; v_width=620; v_height=490;</script>"
set "x=%x:*fid=%"
set "x=%x:";="&rem %
set x=%x:~2%
echo %x%
对正在发生的事情的解释。
您必须处理 5 个特殊字符,即字符串中的 , , , 以及<
用于>
修剪=
尾随数据的字符。 "
&
第 1-3 行: <>
都是重定向字符,因此要处理它们,需要将整个变量用双引号 ( "
) 括起来。但是您不希望将双引号添加到变量本身。
第 1 行通过将第一个引号放在要设置的变量之前x=
(" ),将第二个引号放在要设置的数据之后<script data-cfasync="false" type="text/javascript"> fid="RandonString"; v_width=620; v_height=490;</script>
( "),命令SET识别出引号不包含在变量中。因此可以正确设置带有特殊字符的变量数据。(将引号放在变量数据中也可以,但会在变量数据中添加 2 个特殊字符,使处理其他搜索和替换命令更加困难。)
第 2 行下一步是删除所有内容,包括fid
,*fid
匹配所有内容fid
,然后=%
将其替换为空。
第 3 行下一步是删除 之后的所有内容";
,这需要一点技巧。="&rem %
可以通过添加搜索和替换来欺骗命令处理器执行此操作。'=' 告诉命令处理器;"
用后面的字符替换,但下一个字符是"
,这使得前面的 set 命令成为带引号的命令,这意味着特殊&
字符没有被引用,它可以被解释。这实际上将所有内容&
放在了单独的行上,因此搜索和替换命令";
什么都不替换。该REM
语句用于确保匹配后的数据";
不被解释为命令,也意味着任何重定向字符都将被忽略。
所以命令处理器看到的是:
set x=="RandonString
rem "; v_width=620; v_height=490;</script>
设置x
为="RandonString
第 4 行现在我们遇到了一个问题,因为%x%
,="
和=
都是"
特殊字符,=
特别难以匹配。但是,幸运的是我们知道字符串现在以 开头="
,所以解决方案很简单。我们通过告诉命令处理器从第二个字符开始(当前字符 0 = =
,当前字符 1 = "
,所以字符 2 = R
)来跳过前两个字符。因此,由于第 2 行删除了所有内容(包括任何重定向字符)直到并包括fid
,并且第 3 行删除";
了所有内容,包括字符串末尾(包括任何重定向字符),
%x:~2%
=RandonString
. 删除所有重定向字符后,根本不需要引用该变量。
第 5 行只是回显变量x
。