$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>';
}
}
如何改进代码跳过非必需循环?
也许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>.
可能有一个循环的方法,我会考虑,但由于数组具有相同的键,它们不能合并:
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 结尾。 我曾尝试和。对这些混乱的字符串没有帮助。 我可以忽略带选项的数字的前导字符串,还是必须精明和脚本化? 问题答案: 采用 从手册页: