我想知道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>
方法?
我什么都没发现,所以,即使您有答案的开头,我也会很高兴。
答案 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实体转义:'
:
<?php $foo ="hey a quote ' "; ?>
<input type='text' value='<?php echo $foo; ?>' id='foo' />
现在在您提供的第二个代码示例中,单引号将出现在包装的单引号中(对于传递给alert
的字符串文字)。这是一个问题,因为单引号现在将 end 字符串文字,其后的字符将导致语法错误。
此处引号显示在JavaScript字符串文字(alert
代码)中,而不是在第一个示例的HTML上下文中。在JavaScript字符串文字中,单引号可以用反斜杠转义。
因此,在两种情况下(HTML或JavaScript),您都可能需要一种转义形式。他们是不同的。
请注意,这些都不与PHP相关。