我不确定这是否可行,但这里有
我们有一个页面,可以根据多个TinyMCE表单接收数据。我们希望将这些数据格式化为符合我们的XML存储标准(嗯,大多数是兼容的)。这主要包括剥离创建的某些多余的标记,并重新组织一些东西,以便它与我们的CSS渲染兼容。保留这些标签和属性会在外观和外观之间产生非常明显的差异。我使用正则表达式完成了大部分操作,但是发现了一种我似乎无法为其创建的情况。
基本上,我们会有一段HTML输入,如
<td colspan="3" width="214" valign="top">
<p align="center">
<strong>
Here is some text.
</strong>
</p>
</td>
我们希望用
之类的东西取而代之<td colspan="3" class="center bold">
Here is some text.
</td>
基本上,从<td>
(width
和valign
中剥离任何多余的标记,因为它们存在于我们的CSS中),然后将其赋予center
类,因为由于子元素<p>
而具有align
属性center
和类bold
的子元素<strong>
。
是否有任何图书馆或类似内容可以让我这样做?我可以使用正则表达式,只要它们有效。
答案 0 :(得分:1)
将HTML加载到DOM中,然后将该DOM加载到XPath中。使用XPath查询所需位置,并使用生成的nodeList和node-&gt; parentNode导航相应的字段。 Node类有许多有用的属性,PHP可以读取和评估它们。其余的都是基于属性执行操作。
答案 1 :(得分:1)
由于您要搜索的标记非常具体,定义明确且有效,因此正则表达式解决方案也应该能够很好地工作(并且速度可能会快得多)。假设最初的<TD>
元素始终以colspan="3"
属性开头,<P>
元素将始终只有align="center"
属性,那么此测试的代码段应该执行特技:
$result = preg_replace(
'%# Strip unwanted cruft from TinyMCE generated form markup.
<td\scolspan="3"[^>]+> # TD element opening tag.
\s*<p\salign="center"> # P element opening tag.
\s*<strong>\s* # STRONG element opening tag.
( # $1: Contents to be preserved.
[^<]* # {normal*} Zero or more non-"<"
(?: # Unroll the loop. (See MRE3)
< # {special}. Match a "<"
(?!/?strong\b) # only if not a STRONG tag
[^<]* # More {normal*}
)* # Finish {(special normal*)*}
) # End $1: Contents to be preserved.
\n\s*</strong> # STRONG element closing tag.
\s*</p> # P element closing tag.
\s*</td> # TD element closing tag.
%x',
'<td colspan="3" class="center bold">\n\t$1\n</td>', $text);
请注意,此正则表达式允许内容包含其他内嵌元素(例如<i>
,<img>
等,除了<strong>
之外的任何内容。