我有许多句子,我想用一个单词替换每个单词,这个单词(或其变体)包含在句子中。我把我的正则表达式模式放在一个索引数组中,这些数组是在每个字符串中找到的单个单词。我有第二个数组有替换单词(这些单词只是简单的例子):
$pattern = array('/one/','/two/','/three/');
$replacements = array('ones','twos','threes');
比如说我有句子:
"There is one tree"
然后我想用
替换句子"ones"
我已尝试preg_replace
和preg_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.如果这种方法可行,如何用一个单词替换句子?
答案 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()
也很棒。