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

用前缀和后缀替换部分字符串

农飞尘
2023-03-14
$str = ' I love [123] and [124] at (456). I hate [234] and [235] at (123).'

我想要成功

$str = 'I love <a title="a">[123]</a> and <a title="b">[124]</a> at <a title="XX">(456)</a>. I hate <a title="c">[234]</a> and <a title="d">[235]</a> at <a title="ZZ">(123)</a>.'

用大括号()或[]替换的文本可从表1或表2中找到。

Table 1
123 | a
124 | b
234 | c
235 | d

Table 2
456 | XX
123 | ZZ

当前方法

$text=explode(' ', $text);
for ($i=0; $i<count($text); $i++) {
    for ($j=0; $j<count($table1Col1); $j++) {
        if ($text[$i] == $table1Col1[$j])
            $text[$i] = '<a href="#" title="'.$table1Col2[$j].'">'.$table1Col1[$j].'</a>';
    }
    for ($j=0; $j<count($table2Col1); $j++) {
        if ($text[$i] == $table2Col1[$j])
            $text[$i] = '<a href="#" title="'.$table2Col2[$j].'">'.$table2Col1[$j].'</a>';
    }
}

如何改进代码跳过非必需循环?

共有2个答案

郑嘉悦
2023-03-14

也许preg_replace_callback在这里会更好?

php prettyprint-override">$str = 'I love [123] and [124] at (456). I hate [234] and [235] at (123).';
$t1 = ['123'=>'a', '124'=>'b', '234'=>'c', '235'=>'d'];
$t2 = ['456'=>'XX', '123'=>'ZZ'];


$f1 = implode('|', array_map(fn ($k) => preg_quote($k), array_keys($t1)));
$f2 = implode('|', array_map(fn ($k) => preg_quote($k), array_keys($t2)));

$res = preg_replace_callback("/\[($f1)\]|\(($f2)\)/", function($m) use($t1, $t2) {
  // if first group has matched, then found key will be in `$m[1]`
  // if second group has matched, then found key will be in `$m[2]`
  $m1 = $m[1] ?? null;
  $m2 = $m[2] ?? null;
  if ($m1) {
    // use first table
    return '<a title="'.$t1[$m1].'">['.$m1.']</a>';
  }
  // use second table
  return '<a title="'.$t2[$m2].'">('.$m2.')</a>';
}, $str);

结果:

I love <a title="a">[123]</a> and <a title="b">[124]</a> at <a title="XX">(456)</a>. I hate <a title="c">[234]</a> and <a title="d">[235]</a> at <a title="ZZ">(123)</a>.
王杰
2023-03-14

可能有一个循环的方法,我会考虑,但由于数组具有相同的键,它们不能合并:

foreach($table1Col1 as $find => $repl) {
    $text = str_replace("[$find]",
                        "<a title=\"$repl\">[$find]</a>",
                        $text);
}

foreach($table1Col2 as $find => $repl) {
    $text = str_replace("($find)",
                        "<a title=\"$repl\">($find)</a>",
                        $text);
}
 类似资料:
  • 当你编写一个算术表达式如 B*C 时,表达式的形式使你能够正确理解它。在这种情况下,你知道 B 乘以 C, 因为乘法运算符 * 出现在表达式中。这种类型的符号称为中缀,因为运算符在它处理的两个操作数之间。看另外一个中缀示例,A+B*C,运算符 + 和 * 仍然出现在操作数之间。这里面有个问题是,他们分别作用于哪个运算数上,+ 作用于 A 和 B , 还是 * 作用于 B 和 C?表达式似乎有点模糊

  • 我在互联网上搜索了一个很好的实现,它不是把数字表达式,而是把变量表达式从中缀符号转换成前缀和后缀。我做的所有搜索都没有成功。基本上,我想看看PHP中是否有任何实现,这样我就可以修改它以支持更多的操作符,而不仅仅是(-,*,=)。 例如转换: 同时保留变量名,不必输入数字进行计算。

  • 我应该将以下内容转换为后缀形式: 我得到了这个答案: 这是正确的吗?如果我使用了错误的后缀形式,那么之后还有很多问题都是不正确的。如果我错了,你能告诉我为什么吗?谢谢你的帮助。

  • 在我的脚本中,我有一个字符串及其前缀/后缀。我需要从原始字符串中删除前缀/后缀。 例如,假设我有以下值: 如何得到以下结果?

  • 问题内容: 这是文件列表: 现在,我想对它进行数字排序。以 23 开头,以 102 结尾。 我曾尝试和。对这些混乱的字符串没有帮助。 我可以忽略带选项的数字的前导字符串,还是必须精明和脚本化? 问题答案: 采用 从手册页: