【问题标题】:Replace M for N in words finished on M, but the M it self在 M 上完成的单词中将 M 替换为 N,但 M it self
【发布时间】:2016-02-01 19:55:56
【问题描述】:

问题:我需要将所有以“m”结尾的单词中的“m”替换为“n”,而不是“m”本身。

示例文本: Bombom 有一个 m。

预期回报: Bombon 有一个 m。

当前 PHP 代码: $txt = preg_replace('/(m)(?=\\s|$)/i', 'n', $txt);

但它返回: Bombon 有一个 n。


奖励一:我希望“Word”为[a-zA-ZÀ-ÿ],因此,3m 不应替换为3n

奖励二(针对另一个类似问题)告诉我如何将 Use Q for Iraq and Qatar 替换为 Use Q for Irak and katar(替换所有出现的情况,除非单独出现)。

【问题讨论】:

  • 我投票决定将此问题作为题外话结束,因为它似乎是一项课堂作业。
  • 不,我只是需要为外语创建一个类似于SOUNDEX 的函数

标签: php regex replace


【解决方案1】:

当您正在寻找仅出现在单词末尾的 m 时,即它应该后跟单词边界,但前面应该是一个字母。你可以像这样使用negative lookbehind

正则表达式/(?<=[A-Za-z])m\b/

解释

m\b 匹配 m 后跟单词边界。所以Bombomm 应该匹配。但我们只需要Bombom。所以使用negative lookbehind

(?<=[A-Za-z]) 在匹配 m 之前查找一个字母。

然后将其替换为n

它不匹配 3m,因为 m 前面有一个数字。

Regex101 Demo

【讨论】:

  • 好!!感谢您的帮助。
  • @KennyLajara:不明白你的Bonus two部分。需要详细说明吗?
  • 嘿,很好!!试过了!所以,这不是“奖金二”的解决方案,但我知道我也知道如何解决它。谢谢。
  • @KennyLajara:我已修改我的答案以拒绝3m。现在它只匹配 m 后跟单词边界和前面的字母。
  • 很好,现在是最简单的解决方案。我刚刚为[a-zA-ZÀ-ÿ] 添加了替换[a-zA-Z],它还允许我需要其他字母。
【解决方案2】:

没有正则表达式,但这会做到..

function replaceLastLetter($search, $replace, $subject){
    $words = explode(" ", $subject);
    for($i=0; $i<count($words); $i++){
        $last = substr($words[$i], -1);
        if($last == $search && strlen($words[$i])>1){
            $words[$i] = substr($words[$i], 0, strlen($words[$i])-1).$replace;
        }
    }
    return implode(" ", $words);
}

https://3v4l.org/lJ4WN

【讨论】:

  • 感谢您的想法,我没有发生。虽然无论如何我正在做很多正则表达式,所以如果我没有找到那样的解决方案,那么你的方式将是理想的。
【解决方案3】:

您可以使用[^\w] 匹配非字母/数字,并将它们再次包含在您的替换字符串中:

$input = "Bombom has an m, not 3m.";
$output = preg_replace("/([a-zÀ-ÿ])m($|[^\w])/i", "$1n$2", $input);
echo $output . "<br>";

输出:

Bombon 有一个 m,而不是 3m。

正则表达式将获取前面的字母,它必须是一个字母 (a-zÀ-ÿ),作为第 1 组,后面的非字母/数字 [^\w](或字符串结尾 $)作为第 2 组,并在替换字符串中分别使用$1$2 恢复它们。

对于 Q 的情况,你可以使用这个:

$input = "Use Q for Iraq and Qatar";
$output = preg_replace("/(?:([a-zÀ-ÿ])q($|[^\w])|(^|[^\w])q($|[a-zÀ-ÿ]))/i",
                       "$1$3k$2$4", $input);
echo $output . "<br>";

输出:

对伊拉克和卡塔尔使用 Q

这里用 OR 运算扩展了原理 (|)。由于现在有 4 个捕获组,所有四个都需要在替换字符串中恢复,即使其中只有两个会被实现。另外两个将是空字符串,因此如果它们也存在则不会破坏结果。

正则表达式末尾的i 选项确保qQ 都匹配(不区分大小写)。

【讨论】:

  • 修复了关于\w的错误。毕竟需要使用a-zÀ-ÿ
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
相关资源
最近更新 更多