TL;DR;
您不需要preg_replace。请改用str_replace。
更详细的解释见下文。
注意括号[] 在PCRE syntax 中具有特殊含义可能很重要,因为它们表示character classes。这意味着您的模式可能没有按照您期望的那样做。
例如
preg_replace('[]', 'foo', 'Lorem ipsum dolor sit amet, consectetur [] adipiscing elit. Phasellus quis lectus metus, at posuere neque.')
会给你
"fooLfooofoorfooefoomfoo fooifoopfoosfooufoomfoo foodfooofoolfooofoorfoo foosfooifootfoo fooafoomfooefootfoo,foo foocfooofoonfoosfooefoocfootfooefootfooufoorfoo foo[foo]foo fooafoodfooifoopfooifoosfoocfooifoonfoogfoo fooefoolfooifootfoo.foo fooPfoohfooafoosfooefoolfoolfooufoosfoo fooqfooufooifoosfoo foolfooefoocfootfooufoosfoo foomfooefootfooufoosfoo,foo fooafootfoo foopfooofoosfooufooefoorfooefoo foonfooefooqfooufooefoo.foo"
这根本不是你想要的。
这是因为 PCRE 还需要 delimiters 包围模式。在这里,括号将被视为分隔符,您最终会得到一个空模式。
也可以使用括号样式的分隔符,其中开始和结束括号分别是开始和结束分隔符。 ()、{}、[] 和 <> 都是有效的括号样式分隔符对。
你应该使用
preg_replace('/\[\d*\]/', $replacement, $fulltext);
这将使用 \ 反斜杠字符转义括号,并提供可选数量的数字字符以落入模式匹配表达式。
如果您希望替换字符串位于括号内而不是替换实际的括号,您可以将模式括在圆括号中并使用back references 进行替换。
如果您想将特定模式与特定替换字符串匹配(模式比简单的子字符串搜索/替换更复杂),那么您应该改用preg_replace_callback_array。 但是,需要注意的是,此功能仅在 PHP 7 中可用
示例
$newText = preg_replace_callback_array(
[
'/\[(23)\]/' => function ($match) {
return 'foo';
},
'/\[(24)\]/' => function ($match) {
return 'bar';
},
],
$fulltext
);
这会给你类似......
"Lorem ipsum dolor sit amet, consectetur foo adipiscing elit. Phasellus quis lectus metus, at posuere neque. Sed pharetra nibh bar eget orci convallis at posuere leo convallis. Sed blandit augue [25] vitae augue scelerisque bibendum. Vivamus sit amet libero turpis, non venenatis urna. In blandit, odio convallis suscipit venenatis, ante ipsum cursus [26] augue."
如果您真正需要的是基于子字符串搜索进行替换(例如 [23] 将被替换为字符串 'foo' 而 [24] 将被替换为字符串 'bar' 等...)那么你不需要正则表达式。相反,您可以为此使用str_replace。
这是一个例子......
$fulltext = 'Lorem ipsum dolor sit amet, consectetur [23] adipiscing elit. Phasellus quis lectus metus, at posuere neque. Sed pharetra nibh [24] eget orci convallis at posuere leo convallis. Sed blandit augue [25] vitae augue scelerisque bibendum. Vivamus sit amet libero turpis, non venenatis urna. In blandit, odio convallis suscipit venenatis, ante ipsum cursus [26] augue.';
$searchStrings = [
'[23]',
'[24]',
'[25]',
'[26]',
];
$replacements = [
'[foo]',
'[bar]',
'[baz]',
'[quix]',
];
$newText = str_replace($searchStrings, $replacements, $fulltext);
这给了你
"Lorem ipsum dolor sit amet, consectetur [foo] adipiscing elit. Phasellus quis lectus metus, at posuere neque. Sed pharetra nibh [bar] eget orci convallis at posuere leo convallis. Sed blandit augue [baz] vitae augue scelerisque bibendum. Vivamus sit amet libero turpis, non venenatis urna. In blandit, odio convallis suscipit venenatis, ante ipsum cursus [quix] augue."