当前位置: 首页 > 知识库问答 >
问题:

求这个php正则怎么写?

尉迟宇定
2024-07-04

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即可
求大神指点

共有2个答案

年运珧
2024-07-04
/^\w+(?<!cool) work$/gm
/^\w+(?=((?<!cool) work))/gm
孟晋
2024-07-04

目标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
 类似资料:
  • 正则获取指定字符到下一个大写字符之间的内容

  • 我确定正则本身是没问题的,因为别的文本都正常去掉了标签,但就这个文本(我省略了很多)去不掉标签 我怀疑字符串中的 < 和 > 不对,但是不知道啥问题啊

  • 上述代码可以给每4个数字加一个逗号,但是这正则该怎么理解呢? 因为我的理解结果是1234,5678,9 但实际正则在替换时,似乎是从右向左每4个判断一次,让我很疑惑

  • 问题内容: 这是代码: 输出是然后 为什么是第一个输出而不是? 问题答案: 它在第一个示例中进行整数除法,因为这是数字文字的默认类型。尝试将其更改为(或-d后缀表示a ),您应该得到相同的答案。

  • 我设法安装了pip,但当我使用pip安装下载的车轮时,它会显示: 该文件与PIP位于同一文件夹(脚本)中。

  • 失败:生成失败,出现异常。 > 其中:Script“C:\flutter\packages\flutter_tools\gradle\flutter.gradle”行:900 错误:任务“:app:CompileFlutterBuildDebug”执行失败。 进程“command”C:\flutter\bin\flutter.bat“已完成,退出值为非零%1 生成在%12s中失败异常:Gradle