JavaScript正则表达式替换未按预期工作
我无法通过javascript正则表达式替换清除一些html。 任务是从本地来源获取我的XBMC的电视列表。 URL是(保加利亚语)。 我正试图用刮板来获取数据-(归功于伊万·马尔科夫-) 不幸的是,自从上一次更新上述工具以来,tv listings页面发生了更改,所以我正在尝试让它正常工作。 问题是,当我试图从HTML解析XML时,它会中断。 我现在正试图通过正则表达式替换head和script标记来清理html。不幸的是,它不起作用。 这是我的替代者:JavaScript正则表达式替换未按预期工作,javascript,html,xml,regex,Javascript,Html,Xml,Regex,我无法通过javascript正则表达式替换清除一些html。 任务是从本地来源获取我的XBMC的电视列表。 URL是(保加利亚语)。 我正试图用刮板来获取数据-(归功于伊万·马尔科夫-) 不幸的是,自从上一次更新上述工具以来,tv listings页面发生了更改,所以我正在尝试让它正常工作。 问题是,当我试图从HTML解析XML时,它会中断。 我现在正试图通过正则表达式替换head和script标记来清理html。不幸的是,它不起作用。 这是我的替代者: function regexRepla
function regexReplace(pattern, value, replacer)
{
var regEx = new RegExp(pattern, "g");
var result = value.replaceAll(regEx, replacer);
if(result == null)
return null;
return result;
}
这是我的电话:
var htmlStringCluttered = HTML.getHTML(new URL(url), "WINDOWS-1251");
log("Content grabbed (schedule for next 7 days)");
log(url);
var htmlString = regexReplace("<head>([\\s\\S]*?)<\/head>|<script([\\s\\S]*?)<\/script>", htmlStringCluttered, "");
regexReplace的结果与原始结果完全相同。
由于XML无法解析,脚本无法读取元素。
有什么想法吗?更新: 要将其转换为XMLDocument,可以执行以下操作:
var parseXml,
xml,
htmlStringCluttered = HTML.getHTML(new URL(url), "WINDOWS-1251"),
htmlString = '';
if (typeof window.DOMParser != "undefined") {
parseXml = function (xmlStr) {
return (new window.DOMParser()).parseFromString(xmlStr, "text/xml");
};
} else if (typeof window.ActiveXObject != "undefined" && new window.ActiveXObject("Microsoft.XMLDOM")) {
parseXml = function (xmlStr) {
var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = "false";
xmlDoc.loadXML(xmlStr);
return xmlDoc;
};
} else {
throw new Error("No XML parser found");
}
console.log("Content grabbed (schedule for next 7 days)");
console.log(url);
//eliminate the '<head>' section
htmlString = htmlStringCluttered.replace(/(<head[\s\S]*<\/head>)/ig, '')
//eliminate any remaining '<script>' elements
htmlString = htmlString.replace(/(<script[\s\S]+?<\/script>)/ig, '');
//self-close '<img>' elements
htmlString = htmlString.replace(/<img([^>]*)>/g, '<img$1 />');
//self-close '<br>' elements
htmlString = htmlString.replace(/<br([^>]*)>/g, '<br$1 />');
//self-close '<input>' elements
htmlString = htmlString.replace(/<input([^>]*)>/g, '<input$1 />');
//replace ' ' entities with an actual non-breaking space
htmlString = htmlString.replace(/ /g, String.fromCharCode(160));
//convert to XMLDocument
xml = parseXml(htmlString);
//log new XMLDocument as output
console.log(xml);
//log htmlString as output
console.log(htmlString);
而不是:
htmlStringCluttered = HTML.getHTML(new URL(url), "WINDOWS-1251"),
并在控制台中运行它
您还必须注释掉该行:
console.log(url);
或者声明url
并给它一个值
原件:
您的RegExp需要做一些工作,当它被分解为两个replace
语句时,它更简单(也更容易阅读):
var htmlStringCluttered = HTML.getHTML(new URL(url), "WINDOWS-1251"),
htmlString = '';
console.log("Content grabbed (schedule for next 7 days)");
console.log(url);
//eliminate the '<head>' section
htmlString = htmlStringCluttered.replace(/(<head[\s\S]*<\/head>)/ig, '')
//eliminate any remaining '<script>' elements
htmlString = htmlString.replace(/(<script[\s\S]+?<\/script>)/ig, '');
//log remaining as output
console.log(htmlString);
好吧,我们都知道,所以让我们试着找出真正的问题是什么。为什么不能解析XML?你的限制是什么?事实上,不知道。js中的调用是var html=newxml(Utils.trim(htmlString.substring(39));//错误336551返回的是一个普通字符串。这是控制台输出(包括日志(html))-等等,你想完成什么?你想用什么语言来表达?这段代码中有些是Java,有些是JS,你想在其中完成什么?我知道。我正在试着让代码运行。它部分是java,部分是javascript。javascript解析html,java调用js,并将输出写入XMLTV格式的xml文件。问题是js没有正确解析html。谢谢。正则表达式的输出是绝对正确的。问题是它仍然不会被解析为xml,但我想这是一个完全不同的问题。@nnikolov06:更新了转换为XMLDocument的答案。谢谢!我对未关闭的标签有问题。它工作得很好。现在,我只是在td中独立的文本元素周围添加了一些div标记,这样我可以更轻松地进行迭代。非常感谢你的帮助!
console.log(url);
var htmlStringCluttered = HTML.getHTML(new URL(url), "WINDOWS-1251"),
htmlString = '';
console.log("Content grabbed (schedule for next 7 days)");
console.log(url);
//eliminate the '<head>' section
htmlString = htmlStringCluttered.replace(/(<head[\s\S]*<\/head>)/ig, '')
//eliminate any remaining '<script>' elements
htmlString = htmlString.replace(/(<script[\s\S]+?<\/script>)/ig, '');
//log remaining as output
console.log(htmlString);
console.log(document.documentElement.innerHTML.replace(/(<head[\s\S]*<\/head>)/ig, '').replace(/(<script[\s\S]+?<\/script>)/ig, ''));
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
...
</body>
</html>