douzhaishan5462 2014-02-28 14:31
浏览 66
已采纳

计算字符串中不带反斜杠的引号数

I'm using the following expression to find the number of occurences of ' and " in a string I don't want the count to include \' or \".

$subStr = 'asdf"asdf""a\\"sdf\'asdf\'\'a\\\'sdf';
preg_match_all('/[^\\\\]\'|[^\\\\]\"/', $subStr, $matches);
echo count($matches[0]);

I expect it to return 6 but it only returns 4. I think this is because the strings "" and '' are only count once.

This is what $matches contain:

Array
(
    [0] => Array
        (
            [0] => f"
            [1] => f"
            [2] => f'
            [3] => f'
        )

)

Is there any way I can get the count of 6? Note that I also need to exclude the \" and \'.

  • 写回答

4条回答 默认 最新

  • dongzhuo6137 2014-02-28 14:33
    关注

    Why doesn't it work

    You can't use a character class to match a character not preceded by another character. This is because a character class (negated or not) must still match a character. For example, [^a]b does not mean "b not preceded by a". It means: "a character that's not a followed by b".

    The Solution

    If you want to match a single-quote or double-quote character not preceded by a backslash, then you'll have to use a lookaround expression (a negative lookbehind, specifically).

    The regex you're looking for is (?<!\\\\)[\'"].

    Autopsy:

    • (?<! - start of the lookbehind expression
      • \\\\ - match a literal backslash character
    • ) - end of the lookbehind expression
    • [\'"] - character class that matches a single character from the list "'

    Visual Representation:

    Visual Representation of the regex

    This effectively matches any single-quote / double-quote character that is not preceded by a literal backslash character.

    Using the above expression with preg_match_all is simple:

    $subStr = 'asdf"asdf""a\\"sdf\'asdf\'\'a\\\'sdf';
    preg_match_all('/(?<!\\\\)[\'"]/', $subStr, $matches);
    echo count($matches[0]); // => 6
    

    Demo

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能