如何检测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
相关产品推荐
相关产品推荐

