2014-02-09 79 views
0

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

$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适用于关联数组,但我试着循环索引数组。我必须找到真正匹配句子中单词的正则表达式,并且需要获得匹配的索引以在替换数组中找到正确的单词。这是漫长的,可能是错误的方法。

我的问题是: 1.我接近这个错误? 2.如果这种方法可行,我怎样才能用一个单词替换句子?

+0

这些取代你的实际替换?你只需要在比赛中加入一个's',如果是这样的话,就像[this](http://regex101.com/r/tP3sR1)一样。 – Jerry

+0

我挣扎了一下,准确地解释了我想要做的事情,实际示例文本是:“3件背心”,在句子中包含单词背心或背心的两种情况下,我想用句子替换句子单词“背心”。 – jmarais

回答

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()也很棒。