Javascript方法是否自动转义引号?

时间:2019-04-29 15:22:29

标签: javascript html dom quotes

我想知道javascript方法是否自动转义引号,因为此代码有效:

示例1

 Pattern pattern = Pattern.compile("[^.][app|APP]=(.*?)[,|;]");
 Matcher matcher = pattern.matcher(stringVar);
 if (matcher.find()) {
      return matcher.group(1);
 }

它可以很好地显示警报,但是该警报:

示例2

[^.][app|APP]=(.*?)[,|;|$]

...不是。 很明显,这是因为引号不能用<?php $foo ="hey a quote ' "; ?> <input type="text" value="<?php echo $foo; ?>" id="foo" /> <script> bar = document.getElementById('foo').value; alert(bar+'there is a quote, will it work? ,'); </script> 进行转义。

但是再说一次,在第一个示例中也没有,那为什么会这样呢? javascript的方法从DOM中选取内容时会自动转义引用吗?

或者仅仅是<?php $foo ="hey a quote ' "; ?> <button onclick="alert('<?php echo $foo; ?>');">test</button> 方法?

我什么都没发现,所以,即使您有答案的开头,我也会很高兴。

2 个答案:

答案 0 :(得分:1)

PHP在服务器上处理,产生HTML(在这种情况下,包括嵌入式javascript)。这是在将HTML发送到浏览器进行解释(包括任何JS)之前发生的。

您将看到,如果您检查生成的HTML源,则第二个示例将变为:

<button onclick="alert('hey a quote ' ');">test</button>

这不是有效的JS语法。

您的第一个版本基本上可以正常工作,因为在您插入PHP字符串的代码中没有多余的单引号。插入会产生:

<input type="text" value="hey a quote ' " id="foo" />

这很好。然后将该值传递给JS中的alert调用。

答案 1 :(得分:0)

真正的区别是,在第一个代码示例中,引号出现在没有包装单引号的上下文中,因此没有歧义。如果将HTML属性值用单引号引起来(这也是有效的HTML),那么您会遇到问题:

<?php $foo ="hey a quote ' "; ?>
<input type='text' value='<?php echo $foo; ?>' id='foo' />

在这种情况下,单引号应作为HTML实体转义:&apos;

<?php $foo ="hey a quote &apos; "; ?>
<input type='text' value='<?php echo $foo; ?>' id='foo' />

现在在您提供的第二个代码示例中,单引号将出现在包装的单引号中(对于传递给alert的字符串文字)。这是一个问题,因为单引号现在将 end 字符串文字,其后的字符将导致语法错误。

此处引号显示在JavaScript字符串文字(alert代码)中,而不是在第一个示例的HTML上下文中。在JavaScript字符串文字中,单引号可以用反斜杠转义。

因此,在两种情况下(HTML或JavaScript),您都可能需要一种转义形式。他们是不同的。

请注意,这些都不与PHP相关。