考虑以下字符串
$input = "string with {LABELS} between brackets {HERE} and {HERE}";
我想暂时删除所有标签(=大括号之间的任何标签),以便可以对字符串的其余部分执行操作:
$string = "string with between brackets and";
为了论证,该操作将每个以'b'开头的单词与'yes'连接起来。
function operate($string) {
$words = explode(' ', $string);
foreach ($words as $word) {
$output[] = (strpos($word, 0, 1) == 'b') ? "yes$word" : $word;
}
return implode(' ', $output);
}
此功能的输出为
"string with yesbetween yesbrackets and"
现在我想将暂时删除的标签插回原位:
"string with {LABELS} yesbetween yesbrackets {HERE} and {HERE}"
我的问题是:我怎样才能做到这一点?重要提示:我无法改变操作(),因此解决方案应包含围绕操作()等的包装函数。我一直在考虑这个问题已经有一段时间了,但我对如何做到这一点很困惑。你能救我一下吗?
编辑:在这篇文章中放置实际的操作()太多了。它不会真正增加价值(除了使帖子更长)。这里的operation()和真实的输出之间没有太大的区别。我将能够将这里的任何想法转化为现实世界的情况: - )
答案 0 :(得分:2)
这个问题的答案取决于你是否能够理解 operate()
,即使你无法改变它。
如果您对operate()
完全没有洞察力,那么您的问题根本无法解决:要重新插入标签,您需要其中一个
operate()
)operate()
将如何处理它们,则无法拥有它们)如果你至少对operate()
有一些了解,那么这就变成了可以解决的问题:
operate($a . $b)==operate($a) . operate($b)
,那么您只需按标签拆分原始输入,通过operate()
运行非标签部分,但显然不是标签,然后重新组装operate()
允许一个占位符字符串,保证它本身不是正常输入的一部分(“\ 0”和朋友想到的话),那么你按顺序提取标签,用占位符替换它们,通过operate()
运行结果,然后用保存的标签替换占位符(按顺序)修改强>
阅读完评论后,这里有一些代码
$input = "string with {LABELS} between brackets {HERE} and {HERE}";
//Extract labels and replace with \0
$tmp=preg_split('/(\{.*?\})/',$input,-1,PREG_SPLIT_DELIM_CAPTURE);
$labels=array();
$txt=array();
$islabel=false;
foreach ($tmp as $t) {
if ($islabel) $labels[]=$t;
else $txt[]=$t;
$islabel=!$islabel;
}
$txt=implode("\0",$txt);
//Run through operate()
$txt=operate($txt);
//Reasssemble
$txt=explode("\0",$txt);
$result='';
foreach ($txt as $t)
$result.=$t.array_shift($labels);
echo $result;
答案 1 :(得分:1)
这是我第一次尝试做的事情。将您的字符串拆分为单个单词,然后将它们逐个送入operations(),具体取决于该单词是否为“括号”。
$input = "string with {LABELS} between brackets {HERE} and {HERE}";
$inputArray = explode(' ',$input);
foreach($inputArray as $key => $value) {
if(!preg_match('/^{.*}$/',$value)) {
$inputArray[$key] = operate($value);
}
}
$output = implode(' ',$inputArray);