我尝试设置一个Node.js
服务器来监听联系表单request URL
,然后从联系人data
中检索相关的form
。< / p>
client
基本上会发出一个看起来像这样的请求:
HTML:
<form>
<input type="text" class="typed" placeholder="name" name="name">
<input type="text" class="typed" placeholder="email" name="email">
<input type="text" class="typed" placeholder="subject" name="subject">
<textarea class="typed" placeholder="your enquiry.." name="enquiry"></textarea>
<input type="submit" value="submit">
</form>
JS:
$('form').submit(function ()
{
var name = $.trim($(this).find('[name="name"]').val());
var email = $.trim($(this).find('[name="email"]').val());
var subject = $.trim($(this).find('[name="subject"]').val());
var enquiry = $.trim($(this).find('textarea').val());
$.ajax({
url: "/contactform",
type:'POST',
data: {
name : name,
email: email,
subject: subject,
enquiry: enquiry
}
});
});
浏览器会转义必要的符号并用&#34; +&#34;替换空格。并最终发送出这样的东西:
/contactform?name=some+name&email=someemail%40address.com&subject=some+email+subject&enquiry=some+enquiry
服务器将收到上述请求,它将转义它,然后使用Regex尝试检索它包含的相关数据,如下所示:
var httpServer = http.createServer(function (request, response)
{
// escaping it doesn't actually replace the "+" does it ? Any solutions ?
var requestURL = unescape(request.url);
var name = requestURL.match(/name=([^&email=]*)/)[1]; // returns * so * which is wrong
var email = requestURL.match(/email=([^&subject=]*)/)[1]; // returns an empty string which is wrong
var subject = requestURL.match(/subject=([^&enquiry=]*)/)[1]; // returns * som * which is wrong
var enquiry = requestURL.match(/enquiry=(.*)/)[1]; // returns * some+enquiry * which is correct
}).listen(8080);
正如您在评论中看到的那样,我的正则表达式无法正常工作。您可以在浏览器的控制台上自行尝试。我做错了什么?
此外,正如我刚才所说,从客户端到服务器发送联系表单数据有更好的格式吗?或者?xxx=xxx+xxx+xxx&xxxx=xxxx+xx+xxx&....etc
格式是最好的格式,因为它似乎是标准格式?浏览器强制执行上述格式,但我可以使用JS强制使用不同的格式吗?
我只是认为如果用户遇到例如上述情况,上述情况就不会奏效。在他们输入的文本中的某处使用&amp; subject = 。这种情况极不可能,但仍然有点烦人的是,在服务器上检索表单数据的方式并非100%可靠。或者有一个吗?
上述客户端/服务器端代码显然不完整。我省略了不相关的内容,使其更具可读性。
提前感谢您的帮助。
答案 0 :(得分:1)
为什么不使用内置的url模块来解析网址?它执行所有的unescaping和一切为您。例如:
var url = require('url');
// ...
var httpServer = http.createServer(function (request, response)
{
var info = url.parse(request.url, true);
console.dir(info);
}).listen(8080);
答案 1 :(得分:0)
您需要将以下字符串放入正向前瞻,而不是字符类。
var name = requestURL.match(/name=(.*?)(?=&email=)/)[1];
var email = requestURL.match(/email=(.*?)(?=&subject=)/)[1];
var subject = requestURL.match(/subject=(.*?)(?=&enquiry=)/)[1];
示例:
> requestURL.match(/name=(.*?)(?=&email=)/)[1];
'some+name'
> requestURL.match(/email=(.*?)(?=&subject=)/)[1];
'someemail%40address.com'
> requestURL.match(/subject=(.*?)(?=&enquiry=)/)[1];
'some+email+subject'