2016-05-03 6 views
3

私はいくつかのHTML段落を持っており、すべての単語をラップしたいと思います。今、私は上記のコードは、通常の場合のためにうまく動作するが、時には$paragraphがどのようにhtmlタグ内の「言葉」をラップすることはできません例スパンのすべての単語をPHPでラップする方法は?

$paragraph = "This is an image: <img src='/img.jpeg' /> This is a <a href='/abc.htm'/>Link</a>'"; 

のため、一部のHTMLタグが含まれています

$paragraph = "This is a paragraph."; 
$contents = explode(' ', $paragraph); 
$i = 0; 
$span_content = ''; 
foreach ($contents as $c){ 
    $span_content .= '<span>'.$c.'</span> '; 
    $i++; 
} 
$result = $span_content; 

を持っていますhtmnlタグはまだ動作しますが、他の単語はスパンでラップされていますか?どうもありがとう!

+0

私は '$ c' '<'が存在する場合は何もしないで次の '$ c'に行き、'> 'で部分を見つけるまで何もしないでください。その後、' span'を追加し続けます。 。 – RST

答えて

2

一部(*SKIP)(*FAIL)メカニズム?

<?php 
$content = "This is an image: <img src='/img.jpeg' /> "; 
$content .= "This is a <a href='/abc.htm'/>Link</a>"; 
$regex = '~<[^>]+>(*SKIP)(*FAIL)|\b\w+\b~'; 

$wrapped_content = preg_replace($regex, "<span>\\0</span>", $content); 
echo $wrapped_content; 

ideone.com上だけでなく、regex101.comでデモを参照してください。同様Linkを除外する


、あなたがのために行くことができます:

(?:<[^>]+>  # same pattern as above 
|    # or 
(?<=>)\w+(?=<) # lookarounds with a word 
) 
(*SKIP)(*FAIL) # all of these alternatives shall fail 
| 
(\b\w+\b) 

regex101.com上でこの上のデモを参照してください。

+0

テキストの中でクォートや特殊文字が使われていると、どちらもうまくいかない。ThiとThiを試してみよう’ http://ideone.com/KulE6h – Benn

0

短いバージョンは本当にこれを試したくありません。

長いバージョン:HTMLを扱う場合、HTMLパーサーが必要です。 You can't use regexes。しかし、より面倒なところでは、HTMLで始めるのではなく、HTMLフラグメント(これは正式なものであるかもしれないし、そうでないものもあるかもしれません)があります。もしHTML praserを使って、 HTMLエクステントを分離して、それをセカンダリパーサー(regexesをよく使うかもしれません)に送り、翻訳したコンテンツをDOMに戻してから文書をシリアライズしてください。

関連する問題