繁体   English   中英

我的textArea中的W3C HTML验证程序

[英]W3C Html Validator inside my textArea

我正在开发一个网站,用户可以在其中编写文字描述。 此描述可能像是带有所有html标签( <b></b><a href=''/> etc... )的html内容。

有时,用户会犯错误(例如写<a href='"/>或不关闭标签),并且当描述在我的网站上呈现时,它会破坏整个页面。

我正在寻找一个javascript库或其他工具来验证textarea内容。 与jsfiddle类似,但在我的网站中。

谢谢

更新

为了使用我的应用程序,我简化了过程。 这是代码

的HTML

<div>
   <div class="row">
    <textarea id="idTextArea" style="width:300px; height:100px;"></textarea>
    <button class="btn btn-default" id="idButton">Validate</button>
   </div>
</div>

Java脚本

<script type="text/javascript">
$("#idButton").click(function () {
    var textToTest = "<!DOCTYPE html><html><head><title>Test</title></head><body>" + $("#idTextArea").val() + "</body></html>";

    // emulate form post
    var formData = new FormData();
    formData.append('out', 'json');
    formData.append('content', textToTest);

    // make ajax call
    $.ajax({
        url: "http://html5.validator.nu/",
        data: formData,
        dataType: "json",
        type: "POST",
        processData: false,
        contentType: false,
        success: function (data) {
            var text = "";
            for(var i = 0; i < data.messages.length; i++)
            {
                var extract = data.messages[i].extract;
                var firstColumn = data.messages[i].firstColumn;
                var hiliteStart = data.messages[i].hiliteStart;
                var hiliteLength = data.messages[i].hiliteLength;
                var lastColumn = data.messages[i].lastColumn;
                var lastLine = data.messages[i].lastLine;
                var type = data.messages[i].type;
                var message = data.messages[i].message;

                text += "Type : " + type;
                text += "Message : " + message;

            }
            if (text.length > 0) {
                alert(text);
            }
        },
        error: function () {
            alert(arguments);
        }
    });
})

这可能需要一些修改,但是可以解决。 使用W3C验证程序API

当用户在文本区域中编写描述时,请使用ajax将此内容发送到后端脚本。 在后端脚本中,将textarea内容保存到可公开访问的.html文件(例如textarea.html)中。

然后,在文件保存后的同一脚本中,使用保存的内容的.html文件的URL将CURL请求发送到W3C Validator API

$filepath        = '/mycontent/textarea.html';
$current_content = file_get_contents($filepath);//if you need the old content for some reason
$new_content     = $_GET['textarea_content'];

file_put_contents($new_content, $filepath);

// now use the validator
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://validator.w3.org/check?uri=http://www.myproject.com/mycontent/textarea.html/&output=json");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$output = json_decode(curl_exec($ch), 1);

curl_close($ch);

然后解析JSON(即$ output)以查看是否存在错误。 我亲自尝试了此API,它确实返回了JSON响应,其中包含在查询参数的URI中发现的所有错误。

如果您只想检查拒绝它是否有效(不自动修复它或执行某种错误突出显示),那么一种比较有效的检查方法是使用一些xml解析库来解析一个小写的它。 如果解析失败,则很可能是无效的html。

也许并非所有有效的html5字符串都可以通过测试,但是由于通过了测试,因此请确保使用方式可以更礼貌地编写。

使用xml2json的NodeJS中的示例

#!/usr/bin/env node

// REQUIRES: npm install xml2json
var x2j = require("xml2json").toJson;


function checkHtml(src) {
    try {
        x2j("<data>"+String(src).toLowerCase()+"</data>");
    } catch (err) {
        return false;
    };
    return true;
};

[   
    "<b>Hello World!!</B>",
    "<b>Hello World!!</ B>",
].map(function(html){
    console.log (html, checkHtml(html));
});

// Output:
// -------
// <b>Hello World!!</B> true
// <b>Hello World!!</ B> false

虽然您已经说过要在网站上执行任务,但是我不确定是否会发现这种方法不合适。 基本上,您可以在网站上使用一个表单,然后将其提交给API。

在这里,我只是使用普通表单提交(即,不是ajax),因此用户最终会在验证器的站点上显示结果。 但是,如果要通过ajax提交并明确要求JSON输出,则也可以显示结果。

我使用了以下几个链接: https : //github.com/validator/validator/wiki/Service%3A-Input%3A-textarea https://github.com/validator/validator/wiki/Service%3A-Common -参数

并产生了这个:

<form id='mForm' method='post' action='http://validator.w3.org/nu/' enctype='multipart/form-data'>
    <button type='submit'>Submit</button>
    <textarea id='checkMe' name='content'></textarea>
</form>

从第一个链接: 必须确保内容字段是提交中的最后一个字段。

但是,这不是很令人满意。 当然可以做得更好? 因此,我不断阅读并意识到实现一个Ajax解决方案并不需要太多工作,因此我快速提出了一个讨厌的解决方案。 您可以选择要使用的验证器,然后将响应以JSON的形式返回,我只是将其填充到div中。 您应该解析JSON并创建结构化的错误/成功消息。

这是一个实时演示,可以在页面上正常运行:

 function byId(id){return document.getElementById(id)} function ajaxPostForm(url, formElem, onSuccess, onError) { var ajax = new XMLHttpRequest(); ajax.onreadystatechange = function(){if (this.readyState==4 && this.status==200)onSuccess(this);} ajax.onerror = function(){error.log("AJAX request failed to: "+url);onError(this);} ajax.open("POST", url, true); var formData = new FormData(formElem); ajax.send( formData ); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// window.addEventListener('load', onDocLoaded, false); function onDocLoaded(evt) { byId('goBtn').addEventListener('click', onGoBtnClicked); } function onGoBtnClicked(evt) { ajaxPostForm('http://validator.w3.org/nu/', byId('mForm'), onAjaxOk, onAjaxFail); function onAjaxOk(ajax) { byId('ajaxResult').textContent = ajax.response; } function onAjaxFail(ajax) { alert("bugger. No idea what happened here - I should've bother error checking :p.."); } } 
 textarea { width: 500px; height: 400px; } 
  <h3>Enter code to be validated by w3c</h3> <form id='mForm' method='post' action='http://validator.w3.org/nu/' enctype='multipart/form-data'> <input type='hidden' name='out' value='json'/> <textarea id='checkMe' name='content'></textarea><br> <select name='parser'> <option value='none'>Select Parser</option> <option value='xml'>XML parser, will not load external entities</option> <option value='xmldtd'>XML parser, will load external entities</option> <option value='html'>HTML parser, configuration is based on doctype.</option> <option value='html5'>HTML parser in the HTML5 mode.</option> <option value='html4'>HTML parser in the HTML4 strict mode.</option> <option value='html4tr'>HTML parser in the HTML4 transitional mode.</option> </select> </form> <button id='goBtn'>Submit</button> <hr> <div id='ajaxResult'></div> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM