当前位置: 首页 > 知识库问答 >
问题:

preg_替换和str_替换似乎不能一起使用

年高洁
2023-03-14

我正在尝试创建一个带有[秘密]标签的BB代码。BB代码根据用户级别“修订”文本。然而,我有一个问题,让它正常工作。

我目前的代码是:

    $replace = array(" ", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");
    $text = preg_replace('#\[secret\](.*?)\[/secret\]#si', '\1', str_replace($replace, "█", $text));

它为用户控制杆输出:

█████[██████]███████████.[/██████]█████

这大部分是正确的,但是,它改变了BB标签和其他不应该被编辑的东西。

我已经移动了preg_替换和str_替换的顺序,只是无法使其正常工作。

共有1个答案

冯和硕
2023-03-14

正如我在评论中所说的,在将标记传递给正则表达式匹配之前,您还将用块替换标记。像这样的东西应该能奏效preg\u replace\u callback()的工作原理与preg\u replace()的工作原理几乎相同,但您需要使用一个函数来说明要用什么替换字符串

<?php
$string = "Here is a secret: [secret]foo bar baz[/secret]";
$result = preg_replace_callback("/\[secret\](.*?)\[\/secret\]/si", function($matches) {
    return preg_replace("/[\w ]/i", "&#9608;", $matches[1]);
}, $string);
echo $result;

如果将原始代码分解为多个步骤,则可以看到问题:

<?php
$replace = array(" ", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");
$redacted = str_replace($replace, "&#9608;", $text);
// Clearly, the string "secret" is gone by now, so the regex will never match
$text = preg_replace('#\[secret\](.*?)\[/secret\]#si', '\1', $redacted);
 类似资料:
  • 问题内容: 我最初尝试使用运算符分配值,但返回了错误,然后尝试使用 : 和 但是它正在返回原始价值。 提供有关如何正确使用替换API以获得正确结果的帮助。还有其他任何可用的API可以代替 。 在正在从用户采取的 是由用户的频率串被输入。这个问题几乎不涉及我想知道我是否使用了错误的API变量,因为它为我提供了不变的输出, 我们是否可以使用 从字符串中返回一个字符 来定义API的子字符串。我使用 最大

  • 好吧,我可能不会用正确的方法来做这件事,但现在。。 我有这个字符串,它需要一个链接并提取标签之间的文本... 这个字符串中有几个项目有和符号(在文本部分,而不是标记部分),但是大多数没有。我试图找出一种方法,要么将与号合并到当前模式中,要么在上做另一个preg_replace,以便在标记被删除后删除与号。 谢谢

  • 基本上,我想在句子中替换某些单词(例如,单词“tree”和单词“pizza”)。限制:当应替换的单词位于双引号之间时,不应执行替换。 例子: 有可能用正则表达式实现这一点吗?我会数一数单词前双引号的数量,然后检查它是奇数还是偶数。但是在php中使用preg_replace是否可能? 谢谢 //编辑: 目前我的代码如下: 但这里的问题是用双引号实现逻辑。我试过这样的方法: 但这不起作用,因为它只检查

  • 问题内容: 我执行以下查询,由于某种原因,它没有替换数据库中的换行符。它说Rows匹配1,但没有变化。有什么问题吗? 问题答案: 您可以使用而不是匹配换行符。 代码:

  • Git 对象是不可改变的,但它提供一种有趣的方式来用其他对象假装替换数据库中的 Git 对象。 replace 命令可以让你在 Git 中指定一个对象并可以声称“每次你遇到这个 Git 对象时,假装它是其他的东西”。 在你用一个不同的提交替换历史中的一个提交时,这会非常有用。 例如,你有一个大型的代码历史并想把自己的仓库分成一个短的历史和一个更大更长久的历史,短历史供新的开发者使用,后者给喜欢数据

  • 我正在尝试使用sinon存根替换一个可能需要很长时间的函数。但是当我运行测试时,测试代码似乎没有使用sinon存根。 这是我要测试的代码。 这是测试代码。 我得到一个断言错误 我做错了什么?为什么不使用存根?摩卡的测试框架。