根据子属性修改HTML标记

时间:2011-04-27 14:08:44

标签: php xml regex dom

我不确定这是否可行,但这里有

我们有一个页面,可以根据多个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>widthvalign中剥离任何多余的标记,因为它们存在于我们的CSS中),然后将其赋予center类,因为由于子元素<p>而具有align属性center和类bold的子元素<strong>

是否有任何图书馆或类似内容可以让我这样做?我可以使用正则表达式,只要它们有效。

2 个答案:

答案 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>之外的任何内容。