可将样式表与内联样式合并的PHP库

时间:2012-03-28 作者:ltfishie

我正在处理由Micrsoft Word 2007/2010生成的html文档。除了生成令人难以置信的脏html,word还倾向于同时使用块样式和内联样式。我正在寻找一个php库,它可以将块合并到已经存在的内联样式元素中。

我已经从Word转换了html,并将通过XMLRPC发送它们。php库需要将样式表与内嵌样式合并,以便保留格式。我想打电话到这个图书馆after the request is received by XMLRPC 在到达kses过滤器之前,样式块不会被剥离。

Example

如果原始html为:

    <html>
    <head>
    <style>
    .normaltext {color:black;font-weight:normal;font-size:10pt}
    .important {color:red;font-weight:bold;font-size:11pt}
    </style>
    <body>
    <p class="normaltext" style="font-family:arial">
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
In ut erat id dui mollis faucibus. Mauris eu neque et eros tempus placerat. 
<span class="important">Nam in purus nisi</span>, vitae dictum ligula. 
Morbi mattis eros eget diam vulputate imperdiet. 
<span class="important" style="color:green">Integer</span> a metus eros. 
Sed iaculis porta imperdiet.
    </p>
    </body>
    </html>
应成为:

    <html>
    <head>
    <body>
    <p style="font-family:arial;color:black;font-weight:normal;font-size:10pt">
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
    In ut erat id dui mollis faucibus. Mauris eu neque et eros tempus placerat. 
    <span style="color:red;font-weight:bold;font-size:11pt">Nam in purus nisi</span>, vitae dictum ligula. 
    Morbi mattis eros eget diam vulputate imperdiet. 
    <span style="color:green;font-weight:bold;font-size:11pt">Integer</span> a metus eros. 
    Sed iaculis porta imperdiet.
    </p>
    </body>
    </html>

Goal

最终目标是能够保留Word生成的HTML文件中的所有样式和格式,并将其发送到wordpress,TinyMCE可以在那里对其进行编辑。如果有alternative 对于我所描述的(必须在服务器端完成),我也很乐意接受它作为答案。

2 个回复
SO网友:Adam

我试图复制您在上述示例中提供的相同输出,我只能按照以下方式实现输出:;

<p class=MsoNormal>
    <span class=MsoIntenseReference>
        <span style=\'color:red;text-transform:none;letter-spacing:0pt;font-weight:normal;text-decoration:none\'>
            Red Example text
        </span>
    </span>
</p>
正如您所见,Microsoft Word(2010)正在为段落和span标记插入预定义的类名,此外,它还包装了包含文本的span。

您是如何为包装文本的范围指定类名的?

作为参考,我将我的HTML文件保存为“网页,过滤”,过滤是删除任何“脏”格式单词的关键,否则会应用于文档。

如果我可以复制您在上面的示例中得到的相同输出,那么我们可能可以朝着更简单的解决方案努力。

PS.很抱歉,这是对您问题的回答,但我似乎无法发表评论。我确实打算通过一些额外的评论来完成这一点,这些评论将有助于得到一个完整的答案,因为一旦我对上述最初的问题有了进一步的了解,我想提出一些建议

更新

NOTE: This is intended as a guide to hopefully set you off on the right path and therefore the code provided below are examples missing some functionality in which you will need to write.

理想情况下,您希望XML-RPC脚本以两种方式处理提供内容的内容处理。

1) 通过正则表达式(RegEx)搜索并替换内联样式,使其与WordPress兼容。

2) 以帖子的形式将新清理的内容发布到您的博客。

考虑到您不知道MS Word文档将输出的确切内联样式格式,您可以使用RegEx搜索并在满足特定条件的基础上替换字符之间的文本。

以此为例;

<span style="color:green">Integer</span>

通过RegEx,您可以在<span> 当您找到匹配的“绿色”时,您将使用所需的内联样式替换其中的所有文本;

<span class="green" style="color:green;font-weight:bold;font-size:10pt">

要在WordPress仪表板的post editor屏幕中提供这种内联样式,您需要在TinyMCE编辑器的“样式下拉列表”中添加一些额外的选项,该选项类似于;

    array(
        \'title\' => \'Bold Green Text\',
        \'classes\' => \'green\',
            \'inline\' => \'span\',
        \'styles\' => array(
            \'color\' => \'green\',
            \'fontWeight\' => \'bold\',
                    \'fontSize\' => \'10pt\'
        )
你可以在,

(1)HERE

(2)AND HERE

基本上,您添加的自定义样式应该与您通过RegEx函数提供的样式相匹配。

现在,就您的XML-RPC脚本(例如,通过xmlrpc.php发布)而言,可以看到以下内容:;

<?php

// Your RegExp function for processing your source file

function sanitize_content() {

    gloabl $content;
    $content = \'<span class="important">example content is here</span>\';

    // do your regular expression stuff here

    return $content;

}    

// Your XML-RPC function

function wpPostXMLRPC($title,$content,$rpcurl,$username,$password,$categories=array(1)){

    $categories = implode(",", $categories);
    $XML = "<title>$title</title>"."<category>$categories</category>".$sanitized_content;

    $params = array(\'\',\'\',$username,$password,$XML,1);
    $request = xmlrpc_encode_request(\'blogger.newPost\',$params);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
    curl_setopt($ch, CURLOPT_URL, $rpcurl);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 1);
    curl_exec($ch);
    curl_close($ch);
}

// Do stuff here to initiate your post function

?>
在本例中,您可以看到我在脚本中包含了$内容字符串,但您当然希望将MS Word HTML文件传递给此变量,您可以通过表单或文件路径等来执行此操作。

通过xmlrpc承担您的帖子。php可以通过您的本地主机访问,您可以通过访问,

http://localhost/post-via-xmlrpc.php

整个过程中最困难的部分实际上是您需要查找的正则表达式(RegEx)搜索和替换函数<body> 并删除之前的所有内容,找到</body> 然后删除后面的所有内容,然后同时删除两者<body></body> 然后根据需要替换内联样式来解析其余内容。

如果所有这些都可以通过一个独立的XML-RPC脚本来完成,那么真的不需要再摆弄另一个PHP库了。

SO网友:soulseekah

签出:

将代码从任何一个源代码移植到PHP,或者使用任何可用的API,都可以实现CSS样式的内联。

如果你认为风格不合常规,但又不想让TinyMCE扼杀它们,而这正是你想要这样做的唯一目的,那么你可以更直接地回答这个问题。

TinyMCE有一个valid_children 配置,允许保留样式。通过添加+body[style] 您应该能够通过样式块。

http://codex.wordpress.org/TinyMCE#Customize_TinyMCE_with_Filters

这个keep_styles 选项也应该有帮助,以及paste_remove_styles. 检查此处的默认值http://core.trac.wordpress.org/browser/tags/3.3.1/wp-includes//class-wp-editor.php#L271

你会钩到tiny_mce_before_init 过滤并更改值。

http://core.trac.wordpress.org/browser/tags/3.3.1/wp-includes//class-wp-editor.php#L396

结束

相关推荐

如何通过XML-RPC获取所有帖子(以块为单位)?

I would like to retrieve all posts of a blog via the XML-RPC API of Wordpress.有以下方法blogger.getRecentPosts 和metaWeblog.getRecentPosts 理论上,如果给出足够高的值作为职位数量(或-1),则应返回所有职位。但是,这不适用于非常大的博客或非常弱的服务器,这些服务器无法在内存中保存整个博客。在这种情况下,这些函数最多不会返回任何内容,也不会向响应XML中抛出错误。一种解决方案是一次检