PHP中替换字符串的点为问号时如何跳过指定域名后缀
实现方案
str_replace 不支持条件匹配逻辑,无法实现跳过指定后缀的需求,使用负向前瞻思路搭配 preg_replace 可以快速实现可配置的跳过规则。
核心逻辑
匹配所有不属于跳过后缀的.:即匹配单个.,且这个.后面不跟随你配置的跳过后缀(如com/net/org)。
完整可运行代码
// 自定义可配置的跳过后缀数组 $skip = array(".com",".net",".org"); // 预处理跳过后缀:移除前导点、转义特殊正则字符,生成正则匹配分组 $skipSuffixes = array_map(function($item) { // 去掉开头的点,转义避免特殊字符破坏正则规则 return preg_quote(ltrim($item, '.'), '/'); }, $skip); // 拼接成可匹配多后缀的分支分组 $skipPatternGroup = '(' . implode('|', $skipSuffixes) . ')'; // 待处理原始字符串 $string = "An example of a website would be google.com or similar. However this is not what we are looking for"; // 正则规则:匹配.,且后面不跟随跳过后缀(负向前瞻实现跳过逻辑) $pattern = '/\.(?!' . $skipPatternGroup . ')/i'; // 执行替换 $result = preg_replace($pattern, '?', $string); echo $result;
输出效果
运行后输出完全符合预期:
An example of a website would be google.com or similar? However this is not what we are looking for
补充说明
- 正则末尾的
i修饰符表示不区分大小写匹配,Google.COM这类场景的点也会被保留,不需要可以直接去掉该修饰符。 - 如果需要更严格的匹配(避免把
google.communication里的.comm误判为.com后缀),可以修改正则增加边界判断:
该规则只会跳过后面紧跟着完整跳过后缀、且后缀后为单词边界(空格、字符串结尾、非字母字符等)的点。$pattern = '/\.(?!' . $skipPatternGroup . '(\b|$))/i'; - 后续新增跳过后缀只需修改
$skip数组即可,不需要改动核心正则逻辑。
内容的提问来源于stack exchange,提问作者onlybarca6
相关产品推荐
相关产品推荐

