2016-05-03 3 views
3

У меня есть несколько абзацев HTML, и я хочу обернуть каждое слово. Теперь у меня естьКак обернуть каждое слово в пространстве с помощью PHP?

$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; 

Вышеуказанные коды работают нормально для обычных случаев, но иногда $paragraph бы содержит некоторые HTML-теги, например

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

Как я не могу обернуть «словами» внутри HTML тега так что метки 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's или Thi ’ s http://ideone.com/KulE6h – Benn

0

Короткий вариант: вы действительно не хотите этого делать.

Более длинная версия: если вы имеете дело с HTML, вам нужен HTML-парсер. You can't use regexes. Но там, где становится еще более беспорядочным, вы начинаете с HTML, но с фрагментом HTML (который может быть или не может быть хорошо сформирован. Это может сработать, если Следовательно, вам нужно использовать HTML-калькулятор для определения не- HTML экстенты, разделить их и передать их во вторичный парсер (который вполне может использовать регулярные выражения) для перевода, а затем заменить переведенный контент обратно в DOM до сериализации документа.