我是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)我怎样才能实现“&#34;目标&#34;一个案例敏感的治疗? (没有重复我的数组的长度)。
对不起我的英语,并提前多多感谢。
答案 0 :(得分: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) {
...
(如果您有很多例外(太多)可能有其他策略。)
答案 1 :(得分:1)
在正则表达式模式中用括号括起搜索词,并在替换中使用反向。
请参阅此PHP demo:
pairwise
这样,您将替换为文本中使用的实际案例中找到的单词。
请注意,确保模式按降序排列是非常重要的,较长的模式会出现在较短的模式之前(先Euclidean
,然后是$pattern = array("/\b(explanations)\b/i", "/\b(target)\b/i", "/\b(hints)\b/i", "/\b(hint)\b/i", );
$replacement = array('$1 <i>(Erklärungen)</i>', '$1 <i>Ziel</i>', '$1 <i>Hinsweise</i>', '$1 <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);
等)。