我必须在cmd文件中读取html文件。在那里我必须寻找img标签,在这个标签中必须得到src的字符串。我该怎么处理?
我尝试逐行阅读,并尝试通过以下内容了解img标记内容:
for /f "tokens=*" %%a in (./mypage.htm) do (
echo %%a| findstr /r "<img.*src.*/>">nul
if errorlevel 0 (
echo %%a
)
)
但是有了这个,它显示了所有行以及一些错误消息,例如:&#34;找不到文件&#34;或&#34;语法错误&#34;
答案 0 :(得分:0)
而不是贪婪的量词,尝试使用惰性.*?
并且还要转义斜杠\/
:<img.*src.*?\/>
答案 1 :(得分:0)
如果Windows包含更强大的命令行正则表达式解释器,这可能会更容易。 findstr
适用于提供布尔匹配/不匹配或返回包含匹配的整行,但不能真正与sed
或grep -o
的灵活性竞争匹配和仅返回该行的匹配部分。
我要做的是使用Windows Scripting Host(VBScript / JScript)来获得更强大的regexp和字符串操作工具。这是一个示例.bat / JScript hybrid:
@if (@CodeSection == @Batch) @then
@echo off
setlocal
set "htmlfile=test.html"
rem // invoke hybrid JScript code
for /f "delims=" %%I in ('cscript /nologo /e:JScript "%~f0" "%htmlfile%"') do (
rem // do stuff with %%I
echo found: %%I
)
rem // end main runtime
goto :EOF
@end
// end batch / begin JScript chimera
var fso = WSH.CreateObject('scripting.filesystemobject'),
html = fso.OpenTextFile(WSH.Arguments(0), 1),
images = html.ReadAll().replace(/\r?\n/g, '').match(/img[^>]+?src=(['"]).+?(?=\1)/ig);
html.Close();
WSH.Echo(images.join('\n').replace(/img[^>]+?src=['"]/ig,''));
这应该成功匹配
<img src="typical.jpg">
<img class="noclick" src="class/included.png" />
<img style="border: 0"
src="tag/has/line/break.gif">
<img src="http://apostrophe/in/source's name.jpg">
<img src='single-quoted.jpg' />
...即使sed
或grep
也很难。
如果您有一个特别顽固的HTML文档无法进行正则表达式抓取,您可以将Internet Explorer作为COM对象调用,以将<img>
标记解析为DOM节点。如果您尝试通过JavaScript或CSS伪元素动态填充图像的页面,这将是有益的。这种IE的调用远远超过 ,但它是一种故障保护。
@if (@CodeSection == @Batch) @then
@echo off
setlocal
set "htmlfile=test.html"
for /f "delims=" %%I in ('cscript /nologo /e:JScript "%~f0" "%htmlfile%"') do (
rem // do stuff with %%I
echo %%I
)
rem // end main runtime
goto :EOF
@end
// end batch / begin JScript chimera
var fso = WSH.CreateObject('scripting.filesystemobject'),
IE = WSH.CreateObject('InternetExplorer.Application'),
htmlfile = fso.GetAbsolutePathName(WSH.Arguments(0));
IE.Visible = 0;
IE.Navigate('file:///' + htmlfile.replace(/\\/g, '/'));
while (IE.Busy || IE.ReadyState != 4) WSH.Sleep(25);
var images = IE.document.getElementsByTagName('img');
for (var i=0; i<images.length; i++) WSH.Echo(images[i].src);
IE.Quit();