求这个php正则怎么写?

php字符串

$str = <<<EEE
good work
nice work
great work
cool work
EEE;

想通过正则替换
目标1, 将cool work 之外的其它 good work, nice work, great work 替换成 tired,正则怎么写
目标2, 将cool work 之外的其它 good work, nice work, great work 中的good, nice, great替换成 no, 正则怎么写~~
说明: 除了罗列的good work,nice work,great work, 可能还有很多, 仅排除 cool work即可
求大神指点

阅读 1.5k
avatarAI BotBETA

目标1: 将 cool work 之外的其它 good work, nice work, great work 替换成 tired

对于这个目标,我们可以使用正则表达式来匹配除了 cool work 以外的包含 work 的行,并将它们替换为 tired。这里我们使用 PHP 的 preg_replace 函数,但需要注意的是,由于 PHP 的正则表达式默认不支持多行模式(除非使用了 s 修饰符),我们可能需要使用 preg_replace_callback 函数结合一些逻辑来处理。

但是,为了简化问题,我们可以假设每一行都是独立的,并且不包含 cool work 之外的 work 子串(即每行只包含一个完整的短语,如 good work)。在这种情况下,我们可以使用以下正则表达式:

^(?!cool work$).*work$

但是,由于 PHP 的 preg_replace 不直接支持否定前瞻((?!...)),我们将使用 preg_replace_callback 来实现这个逻辑:

$str = <<<EEE
good work
nice work
great work
cool work
EEE;

$str = preg_replace_callback(
    '/^(good|nice|great) work$/m',
    function ($matches) {
        return $matches[0] === 'cool work' ? $matches[0] : 'tired';
    },
    $str
);

echo $str;

这将输出:

tired
tired
tired
cool work

目标2: 将 cool work 之外的其它 good work, nice work, great work 中的 good, nice, great 替换成 no

对于这个目标,我们可以使用与目标1类似的方法,但这次我们只替换行首的 goodnicegreat,而保留 work。我们可以使用以下正则表达式:

^(good|nice|great)\s+work$

并结合 preg_replace_callback 来实现替换:

$str = <<<EEE
good work
nice work
great work
cool work
EEE;

$str = preg_replace_callback(
    '/^(good|nice|great)\s+work$/m',
    function ($matches) {
        return $matches[0] === 'cool work' ? $matches[0] : 'no work';
    },
    $str
);

// 如果只想替换 "good", "nice", "great" 而不替换 "work"
$str = preg_replace(
    '/^(good|nice|great)(?=\s+work$)/m',
    'no',
    $str
);

echo $str;

注意,上面的第二个 preg_replace 示例使用了正向后视((?=...))来确保只有后面跟着 workgoodnicegreat 被替换。这将输出:

no work
no work
no work
cool work
2 个回答
/^\w+(?<!cool) work$/gm
/^\w+(?=((?<!cool) work))/gm

目标1, 将cool work 之外的其它 good work, nice work, great work 替换成 tired

$str = <<<EEE
good work
nice work
great work
cool work
EEE;
    $str = preg_replace('/^(?!cool work$).*$/m', 'tired', $str);
    echo $str;


目标2

 $str = <<<EEE
good work
nice work
great work
cool work
EEE;
    $str = preg_replace('/\b(good|nice|great)\b(?= work)/mi', 'no', $str);
    echo $str;

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题