目标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类似的方法,但这次我们只替换行首的 good
、nice
、great
,而保留 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
示例使用了正向后视((?=...)
)来确保只有后面跟着 work
的 good
、nice
、great
被替换。这将输出:
no work
no work
no work
cool work