php - 从数组中替换(添加)区分大小写的单词

标签 php arrays regex

我是 php 的新手,尤其是正则表达式。 我的目标是使用数组中列出的“关键字”提示自动丰富文本。

到目前为止我已经来了。

$pattern = array("/\bexplanations\b/i",
            "/\btarget\b/i", 
            "/\bhints\b/i",
            "/\bhint\b/i",
);

$replacement = array("explanations <i>(Erklärungen)</i>",
            "target <i>Ziel</i>", 
            "hints <i>Hinsweise</i>",
            "hint <i>Hinweis</i>",
);

$string = "Target is to add some explanations (hints) from an array to 
this text. I am thankful for every hint.";

echo preg_replace($pattern, $replacement, $string);

返回:

target <i>Ziel</i> is to add some explanations <i>(Erklärungen)</i> (hints <i>Hinsweise</i>) from an array to this text. I am thankful for every hint <i>Hinweis</i>

1)总的来说,我想知道是否有更优雅的解决方案(最终不替换原词)? 稍后说明数组将包含 1000 多个项目......并且来自 mariadb。

2) 我怎样才能实现“目标”一词区分大小写? (不重复我的数组的长度)。

抱歉我的英语不好,非常感谢。

最佳答案

如果您计划增加数组的大小并且文本可能有点长,则处理所有文本(每个单词一次)并不是一种可靠的方法。此外,对于大型数组,用所有单词构建一个巨大的交替是不可靠的。 但是,如果您将所有翻译存储在一个关联数组中并在单词边界上拆分文本,您可以一次性完成:

// Translation array with all keys lowercase
$trans = [ 'explanations' => 'Erklärungen',
           'target' => 'Ziel',
           'hints' => 'Hinsweise',
           'hint' => 'Hinweis'
];

$parts = preg_split('~\b~', $text);

$partsLength = count($parts);

// All words are in the odd indexes
for ($i=1; $i<$partsLength; $i+=2) {
    $lcWord = strtolower($parts[$i]);

    if (isset($trans[$lcWord]))
        $parts[$i] .= ' <i>(' . $trans[$lcWord] . ')</i>';
}

$result = implode('', $parts);

实际上这里的限制是你不能使用包含单词边界的键(例如,如果你想用几个单词翻译整个表达式),但如果你想处理这种情况,你可以使用preg_match_all 代替 preg_split 并构建一个模式来测试这些特殊情况,例如:

preg_match_all('~mushroom pie\b|\w+|\W*~iS', $text, $m);

$parts = &$m[0];
$partsLength = count($parts);

$i = 1 ^ preg_match('~^\w~', $parts[0]);

for (; $i<$partsLength; $i+=2) {

...

(如果您有很多异常(exception)(太多)其他策略也是可能的。)

关于php - 从数组中替换(添加)区分大小写的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40057342/

相关文章:

arrays - 如何在 Swift 3 多维数组中获取垂直切片?

java - 删除标点符号、非阿拉伯语单词和数字(点和逗号除外)

php - 对外部站点的 file_get_contents 请求

php - PHP中如何使用$_GET获取多个同名参数

php - 如何避免CodeIgniter中的 "mysqli_num_rows() expects parameter 1 to be mysqli_result, object given"

javascript - 在每个按钮上单击将值存储在数组中

c++ - 如何将指向数组的指针初始化为成员变量

arrays - 偏移独立散列函数

python - 为什么正则表达式可以理解没有 r 前缀的\n?

javascript - 正则表达式获取第一次和最后一次出现之间的子字符串