我在'/\s+/'
中使用preg_replace
切换来删除Javascript代码中的所有空格,我在PHP数组中传递:
preg_replace('/\s+/', '',
("
function(uploader)
{
if(uploader.files.length > 1)
{
uploader.files.splice(1, uploader.files.length);
apprise('You can not update more than one file at once!', {});
}
}
"))
这是一个非常基本的Javascript缩小。在PHP文件(源代码)中,我可以拥有完全可读的功能代码,而在浏览器中,它的页面主体最终就像单行字符串一样:
function(uploader,files){console.log('[PluploadUploadComplete]');console.log(files);},'QueueChanged':function(uploader){if(uploader.files.length>1){uploader.files.splice(1,uploader.files.length);apprise('Youcannotupdatemorethanonefileatonce!',{});}}
正如您所见(或期望),这确实会影响引号中的字符串并生成不带空格的消息(例如:Youcannotupdatemorethanonefileatonce!
)。
这个问题有解决方法吗?我可以从字符串中的所有地方删除所有空格,除了嵌入单引号的部分吗?
答案 0 :(得分:3)
要匹配除单引号之外的空格字符,请使用:
$regex = "~'[^']*'(*SKIP)(*F)|\s+~";
您可以直接将其弹出preg_replace()
。
例如:$replaced = preg_replace($regex,"",$input);
选项2:多种行情
如果您有单引号或双引号,请使用:
$regex = "~(['"]).*?\1(*SKIP)(*F)|\s+~";
这是如何工作的?
在|
替换的左侧,我们匹配完整"quoted strings"
,然后故意失败,并跳到字符串中的下一个位置。在右侧,我们匹配任何空格,我们知道它是正确的空格,因为它与左侧的表达式不匹配。
参考
How to match (or replace) a pattern except in situations s1, s2, s3...
答案 1 :(得分:2)
您可以简单地捕获单引号字符串并在替换中引用它。请注意,这仅适用于单引号字符串的简单情况,而不是嵌套...
$code = preg_replace("/('[^']*')|\s+/", '$1', $code);