如何使用preg_replace将类名注入html节点?

时间:2011-12-15 01:19:50

标签: php html regex preg-replace inject

我为自己设置了这个相当简单的声音挑战,但现在我不知道如何将如何将类名注入我文档的<body> dom元素

复杂性是因为我无法控制通过file_get_contents功能获得的HTML标记(第三方通过FTP提供文件)。

因此body元素可以是多种不同的方式,例如:

<body>
<body id="my-id" data-attribute="content">
<body data-attribute="content">
<body class="already-existing-class" id="my-id" data-attribute="content">

等等......甚至连所述属性的顺序都在我的控制之下,所以你可能在class=等之前有一个id=

我想你们都明白我在这里谈论的复杂性; (我希望)

我基本上需要的是一种方法,使用preg_replace() 一个新类加入 class属性{{ 1}}(如果已存在)body属性本身添加到我的新课程中。

非常感谢任何帮助。

如果已经回答了这个问题,请随时指出。我试过搜索但是用这样的通用术语很难找到我想要的东西。

感谢阅读。

学家

3 个答案:

答案 0 :(得分:3)

要提供关闭仅限RegEx的解决方案,只要额外的空格不会打扰您; - )

<?php

$pat = '/(<body) ?(([^>]*)class="([^"]*)")?/';
$inp = '<body>
<body id="my-id" data-attribute="content">
<body data-attribute="content">
<body class="already-existing-class" id="my-id" data-attribute="content">
<body id="my-id" data-attribute="content" class="abc">';

echo preg_replace($pat, '$1 $3 class="$4 new-class" ', $inp);

?>

检查ideone输出。

答案 1 :(得分:2)

正则表达式对于此应用程序来说非常麻烦。相反,我建议你使用HTML解析器,例如PHP的DOMDocument。这是一个例子。

$node1 = '<body>';
$node2 = '<body id="my-id" data-attribute="content">';
$node3 = '<body data-attribute="content">';
$node4 = '<body class="already-existing-class" id="my-id" data-attribute="content">';

foreach( range( 1, 4) as $i)
{
    $var = 'node'.$i;
    $doc = new DOMDocument();
    $doc->loadHTML( $$var);
    foreach( $doc->getElementsByTagName( 'body') as $tag)
    {
        $tag->setAttribute('class', ($tag->hasAttribute('class') ? $tag->getAttribute('class') . ' ' : '') . 'some-new-class');
    }
    echo htmlentities( $doc->saveHTML()) . "\n";
}

Demo

请注意<body>标记的输出是正确的。您(或其他SO成员)可以自由决定如何从DOMDocument中提取body标签。

答案 2 :(得分:1)

$str = '<body>
<body id="my-id" data-attribute="content">
<body data-attribute="content">
<body class="already-existing-class" id="my-id" data-attribute="content">
';

$my_new_class = "HELLO_WORLD";
preg_match_all("/<body(.*?)>/is", $str, $m);
$s = sizeof($m[1]);
for($i=0; $i<$s; $i++){
    $m[1][$i] = preg_replace("/class=\"(.*?)\"/is", "class=\"".$my_new_class."\"", $m[1][$i]);
    if(!preg_match("/class=/is", $m[1][$i])){
        $m[1][$i] .= " class=\"".$my_new_class."\"";
    }
    $m[1][$i] = "<body".$m[1][$i].">";
}

print_r($m);
[1] => Array
    (
        [0] => <body class="HELLO_WORLD">
        [1] => <body id="my-id" data-attribute="content" class="HELLO_WORLD">

        [2] => <body data-attribute="content" class="HELLO_WORLD">
        [3] => <body class="HELLO_WORLD" id="my-id" data-attribute="content">
    )