Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Regex来统计';的实例';在引号里_Php_Javascript - Fatal编程技术网

Php Regex来统计';的实例';在引号里

Php Regex来统计';的实例';在引号里,php,javascript,Php,Javascript,我正在尝试制作一个正则表达式,它将计算引号中的每个问号。这个正则表达式正在javascript中测试,但如果有必要的话,我打算在PHP中使用它。我有这样的东西,但还不够好 给你 /(\"|\')(([^\"\'\\]|\\.)*)\?(([^\"\'\\]|\\.)*(\"|\'))/g 正如您可能看到的,我还想忽略转义引号 假设我有字符串“hello?\“world?\”。这将返回正确的1 但是对于这个“你好吗?”“世界?”。这也将返回1,但我想要的是2。我怎样才能做到这一点 另外,如果我能

我正在尝试制作一个正则表达式,它将计算引号中的每个问号。这个正则表达式正在javascript中测试,但如果有必要的话,我打算在PHP中使用它。我有这样的东西,但还不够好

给你

/(\"|\')(([^\"\'\\]|\\.)*)\?(([^\"\'\\]|\\.)*(\"|\'))/g
正如您可能看到的,我还想忽略转义引号

假设我有字符串
“hello?\“world?\”
。这将返回正确的1

但是对于这个
“你好吗?”“世界?”
。这也将返回1,但我想要的是2。我怎样才能做到这一点

另外,如果我能得到一个与此完全相反的正则表达式(计算不在引号中的问号),我会非常高兴

如果有帮助的话,下面是用于此测试的整个函数

function countTest(str) {
    regx = /(\"|\')(([^\"\'\\]|\\.)*)\?(([^\"\'\\]|\\.)*(\"|\'))/g;

    test = str.match(regx);
    test = test ? test.length : 0;

    console.log(test);
}
编辑:


还有!我注意到我自己在这个问题上的输入错误,字符串
hello\'world?\'“
也将返回1。不过,这似乎很容易解决。

所以我刚刚尝试了它,很明显,显示1的原因是,因为测试不是作为字符串处理的,而是作为数组处理的。所以我会替换

test = test ? test.length : 0;

换句话说,您将从数组的字符串值中减去3个字符“”,但添加1,因为第一个数组元素没有逗号字符

编辑:对于引号外的问号计数,只需从字符串中的问号总数中减去上面给出的数字即可


编辑:对于PHP,您可能会使用array_slice函数而不是new String(test),并根据需要调整乘法和加法常量。

我不会为此使用正则表达式o:那我该怎么办?也许可以循环通过字符串并以这种方式进行测试?这样会更有效吗?也许不会,但肯定会更具可读性。如果其他人遇到这个countTest函数,他将不理解它的用途。技术的应用,蝙蝠侠,关键是,结果是每个匹配序列的数组。换句话说,如果你有一个类似“Hello?”“World???”的字符串,你会得到一个数组“?”,“?”,你需要加len(test[0])+len(test[1])=1+3才能得到引号中的问号。因此,根据这个公式,它将等于len(“?”,“?”)-3*2+1=9-6+1=4。依赖数组字符串化的细节似乎不可靠。为什么不干脆
测试长度-1
?这是backref匹配的数量。事实上,我认为正则表达式需要调整一些
?:
,以防止非
被视为反向引用;我上面的帖子回答了这个问题,在这一点上,他们只是删除了他们的问题。阅读我上面的帖子,看看它是否回答不了你的问题。
test = test ? new String(test).length - 3 * test.length + 1: 0;