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

PHP中如何简化双向str_starts_with与str_ends_with的判断逻辑?

简洁实现方案

当然有更简洁的实现方式,下面给你几种实用方案:

1. 封装工具函数(推荐,兼顾可读性与效率)

把判断逻辑封装成可复用的函数,后续调用只需一行代码,还优化了原逻辑的执行效率:

function isPrefixOrSuffix(string $a, string $b): bool {
    $lenA = strlen($a);
    $lenB = strlen($b);
    // 先比长度,避免无意义的函数调用:短字符串不可能是长字符串的前缀/后缀
    return $lenA >= $lenB 
        ? str_starts_with($a, $b) || str_ends_with($a, $b) 
        : str_starts_with($b, $a) || str_ends_with($b, $a);
}

// 调用示例
if (isPrefixOrSuffix($foo, $bar)) {
    // ...业务逻辑
}

2. 正则表达式实现

用正则需要注意转义特殊字符(比如.、*这类正则元字符),否则会导致匹配出错,写法如下:

// 先转义两个字符串中的正则特殊字符
$escFoo = preg_quote($foo, '/');
$escBar = preg_quote($bar, '/');

// 判断$foo是否以$bar开头/结尾,或$bar是否以$foo开头/结尾
if (preg_match("/^$escBar|$escBar$/", $foo) || preg_match("/^$escFoo|$escFoo$/", $bar)) {
    // ...业务逻辑
}

这种写法适合场景特殊的情况,但可读性不如封装函数。

3. 一行代码简化(无封装短写法)

如果不想封装函数,也可以把逻辑压缩成一行,比原代码更紧凑:

if ((strlen($foo) >= strlen($bar) ? (str_starts_with($foo, $bar) || str_ends_with($foo, $bar)) : (str_starts_with($bar, $foo) || str_ends_with($bar, $foo)))) {
    // ...业务逻辑
}

缺点是可读性略差,适合仅临时使用一次的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:55:57