暂时删除标签/标签,稍后重新插入

时间:2012-02-12 23:39:57

标签: php

考虑以下字符串

$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()和真实的输出之间没有太大的区别。我将能够将这里的任何想法转化为现实世界的情况: - )

2 个答案:

答案 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);