2016-10-06 6 views
0

私はhtmlと混在したテキスト文字列を持っており、という単語を別々にして、の文字列で囲む必要があります。スパンの単語だけを折り返す方法は?

文字列:

$string ='<div class="something">What </div> if it it is is same <div style="color:red;">same </div>'; 

所望の出力

<div class="something"> 
    <span class="splits split1"> 
    What 
    </span> 
</div> 
<span class="splits split2"> 
    if 
</span> 
<span class="splits split3"> 
    it 
</span> 
<span class="splits split4"> 
    it 
</span> 
<span class="splits split5"> 
    is 
</span> 
<span class="splits split6"> 
    is 
</span> 
<span class="splits split7"> 
    same 
</span> 
<div style="color:red;"> 
    <span class="splits split8"> 
    same 
    </span> 
</div> 

私はワード境界、するpreg_match、str_replace、爆発とのコンボ、ループとにpreg_replace、考えると置き換えることができるすべてを試してみましたが、一つの方法または別の出力が失敗し、htmlを制動するか、または置き換えられない場所に置き換えられます。

何か助けていただければ幸いです。

+6

DOM用に設計された1つのツール:DOMを忘れてしまった。 DOMで抽出された個々のhtmlノードを取得したら、テキストノードで作業してhtmlに変換することができます。 –

+0

@MarcBあなたはそれについて正しいです、あなたが例を示す時間があれば素晴らしいでしょう。 – Benn

答えて

1

@MarcBはおいしくですが、質問がタグ付けされているので、これは回避策(ではない100%がが保証する)可能性があり、ここでDOMの生活と、言ったように:

</?\b[^<>]+>(*SKIP)(*F)|\w+ 

はPHP:

preg_replace_callback('~</?\b[^<>]+>(*SKIP)(*F)|\w+~', function($matches) { 
    static $counter = 0; 
    return "<span class=\"splits split".(++$counter)."\">{$matches[0]}</span>"; 
}, $string); 

Live demo

+0

テストしますが、あなたがそれを釘付けにしたように見えます。 – Benn

関連する問題