我是 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/