2012-02-12 8 views
1

に後でそれを再挿入残りの文字列:引数の便宜上一時的にラベル/タグを削除し、

$string = "string with between brackets and"; 

、操作は、単語「はい」と「B」で始まるすべての単語を連結しています。

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}" 

私の質問は:どのように私はこれを達成することができます?重要:私は、操作()を変更することができないので、ソリューションには、関数()や何かのラッパー関数が含まれているはずです。私はこれについてかなり長い間考えていましたが、これをどうやって行うのか混乱しています。私を助けてくれますか?

編集:この投稿に実際の操作()を入れることは多すぎるでしょう。実際に価値を上げることはありません(投稿を長くすることを除いて)。ここでは、実際の出力()と実際の出力の間に大きな違いはありません。私はここからのあらゆるアイデアを現実の状況に翻訳することができます:-)

+0

あなたはoperate'を詳細に何をするか '記述するために必要なコードの一部の行であるか、良い答えを考え出すのは難しいことになるだろう。 –

+0

実際には、操作()は、最初にタグ付けされた単語をタグ付けするPOSタグ付けツールです:string/NN/VBブラケット/ NNと/ INの間(タグは絞られています。ここに)。次に、いくつかの単語を固定文字でタグ付けします。結果は原理的にOPで述べた操作()に似ています。操作する単語の数は入力された単語の数と同じですが、いくつかの単語の前に連結された「はい」があります。したがって、出力された単語から「はい」を取り除くことによって元の入力を見つけることが可能である。私はこれが役立つことを願っています – Pr0no

答えて

2

これに対する答えは、天気を依存するかどうか、あなたはそれを変更できない場合でも、operate()を理解することができます。あなたが彼らのオフセットまたは相対位置

    • のいずれかが必要あなたのラベルを再挿入するには(あなたはドン場合は、それらを知ることができない」:

      あなたはoperate()に全く洞察力を持っていない場合は、あなたの問題は、単純に解決できないですあなたはoperate()に、少なくともいくつかの洞察力を持っている場合はtは、operate()

    • その場所のマーカー(あなたはoperate()がそれらに動作する方法がわからない場合は、それらを持つことはできません)

    を知っています、その後、

  • operate()場合は再組み立て

    • operate($a . $b)==operate($a) . operate($b)場合は、あなただけの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; 
    
  • +0

    ご意見ありがとうございます。最初のコメントへの私の返事を見て、更新された操作()を見てください。これは必要な洞察を与えるのだろうか? – Pr0no

    +0

    AFAIKSそれは '\ 0'だけを残すので、元の文字列に' \ 0'がないと確信すれば、上記の2番目のオプションが有効です。 –

    +0

    申し訳ありません、\ 0はどういう意味ですか?入力文字列には常にzA-Z {}が含まれ、それらの間に他の文字({bracket:2344}など)が含まれていますが、それ以前には除外されます。 – Pr0no

    1

    これは最初の試みとして私がやっていることです。あなたの文字列を1つの単語に分割し、単語が 'braced'であるかどうかに応じて、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); 
    
    +0

    操作()はPOSタグャーです(最初の返信と更新された操作()の私のコメントを参照)ので、(ラベルなしで)文字列全体を一度に操作する必要があります。それを単語ごとにフィードすることは選択肢ではありません。 – Pr0no

    関連する問題