php str_replace的奇怪行为

owfi6suc  于 2023-06-04  发布在  PHP
关注(0)|答案(1)|浏览(144)

我有一个用户可设置的文本,其中默认的是[Log in] or [register] to view the content
我需要的是把这两个词用方括号括在它们各自的链接中。但首先,我需要检查用户是否没有更改这个默认文本,换句话说,他们是否保留了方括号。我不会花太多时间去检查这个。只要存在两组方括号就足够了。如果是这样的话,那么我假设第一个链接是登录页面,第二个是注册帐户页面...
所以,下面的if为我做了这项工作:

if ( preg_match( '/\[(.*?)\].*\[(.*?)\]/', $text ) )

然后,在if中,我的计划是用两个数组执行str_replace(),如下所示:

$text = str_replace( array( '[', ']', '[', ']' ), array( '%1$s', '%2$s', '%3$s', '%4$s' ), $text );

但这和我想的不一样。我认为,由于两个数组的元素数量相等,它会进行1对1的搜索和替换,这意味着它会将文本转换为%1$sLog in%2$s or %3$sregister%4$s to view the content,而它会将文本转换为%1$sLog in%2$s or %1$sregister%2$s to view the content
为什么会这样?如果这不是正确的方法(显然不是),我应该怎么做?
任何帮助将非常感谢。TIA。

mi7gmzs6

mi7gmzs61#

尝试使用相同模式的preg_replace(带有额外捕获):

$text = preg_replace('/\[(.*?)\](.*)\[(.*?)\]/', '%1$s$1%2$s$2%3$s$3%4$s', $text);

它产生

%1$sLog in%2$s or %3$sregister%4$s to view the content

str_replace并没有按照你想要的方式工作--第一个数组是一个没有位置感的针数组,所以第二组[]在你的例子中是重复的针。
参见测试仪

相关问题