因此,我有一个html文件,其行如下:
<script data-cfasync="false" type="text/javascript"> fid="RandonString"; v_width=620; v_height=490;</script>我的任务是在不使用任何外部软件的情况下找到fid="RandomString"并将"“之间的所有内容复制到文本文件中。RandonString长2-100个字符.
发布于 2012-10-20 21:55:06
这并不难,这里有一个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 E 223识别变量中不包含引号。因此,可以在没有错误的情况下设置具有特殊字符的变量数据。(将引号放入变量数据中也可以,但是在变量数据中添加了2个特殊字符,使得处理其他搜索和替换命令更加困难。)
第2行下一步是删除到并包含fid的所有内容,*fid将所有内容匹配到fid,=%将其替换为nothing。
第3行下一步是删除";之后的所有内容,这需要进行一点黑客操作。可以通过将="&rem %添加到搜索和替换中来欺骗命令处理器。'=‘告诉命令处理器用以下字符替换;",但下一个字符是",这使前面的set命令成为一个引号命令,并意味着特殊的&字符没有引号,因此可以对其进行解释。这实际上将&之后的所有内容放在单独的行中,因此搜索和替换命令将";替换为nothing。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。
https://stackoverflow.com/questions/12973880
复制相似问题