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

时间:2016-10-15 09:26:14

标签: 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)我怎样才能实现“&#34;目标&#34;一个案例敏感的治疗? (没有重复我的数组的长度)。

对不起我的英语,并提前多多感谢。

2 个答案:

答案 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); 等)。