检查并替换行尾或空格前的字符

koj*_*ow7 9 php arrays string whitespace replace

我目前有两个数组设置,我试图检查一个单词中的最后两个字母,如果与第一个数组匹配,则将其替换为其他字符.我目前正在努力做到这一点到行尾,但我无法弄清楚如何为不在行尾的单词执行此操作.

以下是我的数组可能是什么样子的示例.这些是从数据库查询填充的.字符可以是任何Unicode字符,因此不一定在AZ或az的范围内.

$array1 = ['mp', 'tm', 'de', 'HK'];
$array2 = ['MAP', 'TM', "DECIMAL", '?'];
Run Code Online (Sandbox Code Playgroud)

我当前的代码如下所示:

$mystring = "samplemp";
$last = substr($mystring, -2);
$newlast = str_replace($array1, $array2, $last);
if ($last != $newlast){
    $mystring = substr($mystr, 0, 2).$newlast;
}
Run Code Online (Sandbox Code Playgroud)

我的工作:

所以,我目前的代码查看了字符串中的最后两个字符.如果最后两个字符是"mp",例如它用"MAP"替换它们.所以如果我的字符串看起来像:

samplemp
Run Code Online (Sandbox Code Playgroud)

它被正确地改变为

sampleMAP
Run Code Online (Sandbox Code Playgroud)

到目前为止一切正常.

问题

我遇到的问题是处理不在字符串末尾的单词.例如:

samplemp okay de     hellotm
blatm theHK end
Run Code Online (Sandbox Code Playgroud)

应该换成

sampleMAP okay DECIMAL     helloTM
blaTM the? end
Run Code Online (Sandbox Code Playgroud)

我希望能够考虑所有空白区域,包括空格,制表符和回车.但是,空格必须保持完整且不会更改.空格必须保留为空格,制表符作为制表符,并且回车时返回回车符.

到目前为止,我已经能够弄清楚我可能需要使用\s转义字符来使用正则表达式来计算空格.但是,我无法理解如何在作用于数组的str_replace函数中使用它.有没有办法做到这一点?如果没有,我还应该做些什么才能让它发挥作用?

Tot*_*oto 4

我会做:

\n\n
$string = <<<EOD\nsamplemp okay de     hellotm\nblatm theHK end\nEOD;\n$array1 = [\'mp\', \'tm\', \'de\', \'HK\'];\n$array2 = [\'MAP\', \'TM\', "DECIMAL", \'\xe5\xad\x97\'];\n\n$hash = array_combine($array1, $array2);\nforeach($hash as $k => $v) {\n    $string = preg_replace_callback(\'/\'.preg_quote($k).\'(?=\\s|$)/u\', function($m) use($v) {\n        return $v;\n    },\n    $string\n    );\n}\necho $string,"\\n";\n
Run Code Online (Sandbox Code Playgroud)\n\n

其中(?=\\s|$)有一个向前看,它确保我们在搜索的键之后有任何类型的空格(即空格、制表、回车、换行符……)或字符串结尾。这样,我们就保持空白不变。

\n\n

/u是 unicode 标志。

\n\n

输出:

\n\n
sampleMAP okay DECIMAL     helloTM\nblaTM the\xe5\xad\x97 end\n
Run Code Online (Sandbox Code Playgroud)\n