我有一个正则表达式,我希望以最有效的方式将匹配数组中的每个匹配替换为相应的替换数组。
例如,我有:
$string = '~~hello~~ there, how ~~are~~ ~~you~~?';
$pattern = '/~~(.*?)~~/';
$replacements = array();
$replacements[0] = 'hi';
$replacements[1] = 'am';
$replacements[2] = 'i';
我希望将$string
变成:
hi there, how am i?
最初,我希望它会像以下一样简单:
$string = preg_replace($pattern, $replacements, $string);
但它似乎不起作用。所以第一个问题是:如果$replacements
是一个数组,那么$string
是否也必须是一个数组?
现在,我可以提出(看似)效率低下的方法,例如计算匹配数并使数组填充适当数量的相同正则数。但这引出了我们的问题二:是否有更有效的方法?你会怎么做,PHP专业人士?
答案 0 :(得分:2)
您可以在此处使用简单的评估技巧:
print preg_replace('/~~(\w+)~~/e', 'array_shift($replacements)', $st);
array_shift
只会从替换数组中获取第一个条目。
最好使用地图("hello" => "hi"
)。
答案 1 :(得分:1)
我可以使用preg_replace_callback
:
$string = '~~hello~~ there, how ~~are~~ ~~you~~?';
$pattern = '/~~(.*?)~~/';
var_dump(preg_replace_callback($pattern,
function($matches) {
static $replacements = array('hi', 'am', 'i'), $i = 0;
return $replacements[$i++ % count($replacements)];
},
$string));
输出:
string(19) "hi there, how am i?"
答案 2 :(得分:1)
如果您要做的就是将这三个特定短语与另一组特定短语分开,那么您可以使用str_replace
,因为它比preg_replace
快得多。
$subject = "~~hello~~ there, how ~~are~~ ~~you~~?";
$matches = array('~~hello~~', '~~are~~', '~~you~~');
$replace = array('hi', 'am', 'i');
str_replace($matches, $replace, $subject);