如何用PHP包装每个单词?

时间:2016-05-03 09:05:51

标签: php html regex preg-replace explode

我有一些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;

以上代码适用于正常情况,但有时$paragraph会包含一些html标记,例如

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

我怎么能不在html标签中包含“单词”,以便htmnl标签仍然可以工作但是其他单词包含在跨度中?非常感谢!

2 个答案:

答案 0 :(得分: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 上查看演示。

答案 1 :(得分:0)

简短版本是你真的不想尝试这个。

更长的版本:如果您正在处理HTML,那么您需要一个HTML解析器。 You can't use regexes。但是它变得更加混乱的是你不是从HTML开始,而是使用HTML片段(可能或者可能不是格式良好。如果因此你需要使用HTML praser来识别非HTML扩展区,将它们分离出来并将它们提供给辅助解析器(可能使用正则表达式)进行转换,然后在将序列化文档之前将已转换的内容替换回DOM。