You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测PHP代码中某个位置是否处于引号内?

完善引号内位置检测函数及PHP代码处理示例

看起来你正在构建处理PHP代码的工具,其中核心的is_in_quotes函数还没写完——这个函数确实是处理代码时的关键,毕竟要避免误改引号内的内容(比如注释符号出现在字符串里就不能当作注释处理)。我来给你补全并优化这个函数:

完整的is_in_quotes函数实现

function is_in_quotes($string, $pos) {
    $in_single_quote = false;
    $in_double_quote = false;
    $length = strlen($string);
    
    for ($i = 0; $i < $pos; $i++) {
        // 跳过转义字符,转义后的引号不触发状态切换
        if ($string[$i] === '\\') {
            $i++;
            continue;
        }
        
        // 处理单引号:仅当不在双引号中时切换状态
        if ($string[$i] === "'" && !$in_double_quote) {
            $in_single_quote = !$in_single_quote;
        }
        // 处理双引号:仅当不在单引号中时切换状态
        if ($string[$i] === '"' && !$in_single_quote) {
            $in_double_quote = !$in_double_quote;
        }
    }
    
    // 判断目标位置是否处于任意未闭合的引号内
    return $in_single_quote || $in_double_quote;
}

函数逻辑说明

这个函数通过遍历字符串到目标位置$pos之前的所有字符,精准跟踪引号的开闭状态:

  • 遇到转义符\时直接跳过下一个字符,避免误判转义后的引号
  • 严格区分单双引号的互斥状态:比如处于双引号内时,单引号不会触发状态切换
  • 最终返回目标位置是否处于未闭合的单/双引号中

实战示例:用该函数移除PHP代码中的注释

下面是一个利用is_in_quotes函数移除PHP单行和多行注释的示例,直观展示它的用法:

function remove_php_comments($code) {
    $lines = explode("\n", $code);
    $in_multiline_comment = false;
    $clean_code = [];
    
    foreach ($lines as $line) {
        $processed_line = '';
        $line_length = strlen($line);
        
        for ($i = 0; $i < $line_length; $i++) {
            // 进入多行注释(仅当不在引号内时生效)
            if (!$in_multiline_comment && !is_in_quotes($line, $i) && substr($line, $i, 2) === '/*') {
                $in_multiline_comment = true;
                $i++;
                continue;
            }
            
            // 退出多行注释
            if ($in_multiline_comment && substr($line, $i, 2) === '*/') {
                $in_multiline_comment = false;
                $i++;
                continue;
            }
            
            // 跳过多行注释内容
            if ($in_multiline_comment) {
                continue;
            }
            
            // 截断单行注释(仅当不在引号内时生效)
            if (!is_in_quotes($line, $i) && substr($line, $i, 2) === '//') {
                break;
            }
            
            $processed_line .= $line[$i];
        }
        
        if (!$in_multiline_comment) {
            $clean_code[] = rtrim($processed_line);
        }
    }
    
    return implode("\n", $clean_code);
}

注意事项

  • 目前的函数仅处理普通单双引号,如果你的场景需要支持PHP的heredoc/nowdoc语法,还需要额外添加对应的检测逻辑
  • 调用时请确保$pos是有效的字符串索引(范围在0到strlen($string)-1之间)

内容的提问来源于stack exchange,提问作者Gustavo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:15:33