我为自己设置了这个相当简单的声音挑战,但现在我不知道如何将如何将类名注入我文档的<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
属性本身添加到我的新课程中。
非常感谢任何帮助。
如果已经回答了这个问题,请随时指出。我试过搜索但是用这样的通用术语很难找到我想要的东西。
感谢阅读。
学家
答案 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";
}
请注意<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"> )