我有一些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标签仍然可以工作但是其他单词包含在跨度中?非常感谢!
答案 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。