使用php中的preg替换数组中元素的字符串

时间:2014-02-09 15:48:55

标签: php regex arrays

我有许多句子,我想用一个单词替换每个单词,这个单词(或其变体)包含在句子中。我把我的正则表达式模式放在一个索引数组中,这些数组是在每个字符串中找到的单个单词。我有第二个数组有替换单词(这些单词只是简单的例子):

$pattern = array('/one/','/two/','/three/');
$replacements = array('ones','twos','threes');

比如说我有句子:

"There is one tree"

然后我想用

替换句子
"ones"

我已尝试preg_replacepreg_replace_calback,但不确定使用哪一个或是否应使用preg_match

我正在尝试这个:

$simplified = preg_replace_callback($pattern, function($matches) {
      return $replacements[array_search($matches[0], $pattern, true)];
}, $simplified, 1);

其中$simplified包含我要用。替换句子的单词。

我相信array_search适用于关联数组,但我也尝试在索引数组中循环。我必须找到与句子中的单词实际匹配的正则表达式,并且需要获取该匹配的索引以在替换数组中找到正确的单词。这是漫长的啰嗦,可能是错误的做法。

我的问题是: 我接近这个错误了吗? 2.如果这种方法可行,如何用一个单词替换句子?

1 个答案:

答案 0 :(得分:0)

preg_replace_callback()不适合此任务 - 对于正则表达式中的每个匹配,它调用一个将匹配文本作为参数传递的函数。你不希望出现这种情况。请改用preg_match()

首先,创建一个关联数组,其中模式字符串作为键,替换字符串作为值。遍历组合数组,检查模式是否与字符串匹配 - 如果匹配,则用相应的$replacement替换整个单词并退出循环。

<强>代码:

$string = "There is one tree"; 

$patterns = array('one','two','three');
$replacements = array('ones','twos','threes');
$combined = array_combine($patterns, $replacements);

foreach ($combined as $pattern => $replacement) {
    $pattern = sprintf('/\b%s\b/', preg_quote($pattern, '/'));
    if (preg_match($pattern, $string)) {
        $string = $replacement;
        break;
    }
}

echo $string; // => ones

备注:

  • sprintf()仅用于创建模式字符串
  • preg_quote()正确转义正则表达式字符。如果您有一个需要在某些文本中匹配的运行时字符串,并且字符串可能包含特殊的正则表达式字符,这将非常有用。
  • \b是一个在任何单词边界匹配的元字符。换句话说,\b匹配单词开头或结尾的空字符串。匹配为零长度,意味着它不消耗任何字符

有关preg_replace_callback()的详情,建议您阅读this answer。它非常简短地描述了preg_replace_callback的工作。 documentation for preg_replace_callback()也很棒。