简短概述
你不需要使用preg_replace
。可以使用str_replace
代替。
详细解释请见下文。
需要注意的是,括号[]
在PCRE语法中具有特殊含义,它们表示字符类。这意味着你的模式可能在这里没有达到你的预期。
例如
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还需要将模式用分隔符括起来。在这里,括号将被视为分隔符,导致你得到一个空模式。
也可以使用括号样式的分隔符,其中开括号和闭括号分别作为起始和结束分隔符。()
、{}
、[]
和<>
都是有效的括号样式分隔符对。
相反,你应该使用
preg_replace('/\[\d*\]/', $replacement, $fulltext);
这个使用反斜杠字符\
转义括号,提供可选的数字字符来匹配表达式。
如果您希望替换字符串落在括号内而不是替换实际的括号,您可以将模式括在圆括号中,并使用回溯引用进行替换。
如果您想要将特定的模式匹配到特定的替换字符串中(其中模式比简单的子字符串搜索/替换更复杂),那么您应该使用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."
preg_replace('/\d*/', $replacement, $fulltext);
没有什么区别。 - Sherifpreg_replace
将以Delimiter must not be alphanumeric or backslash
的错误失败。如果在回答中修复了这个问题,我会给予赞同。 - Sherif