$content
变量包含带有HTML段落标记的字符串,例如:
$content = "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<p>Aliquam mauris diam, gravida eget finibus varius.</p>";
如何使用PHP regex将类“textStyle”添加到每个段落,使其如下所示:
$content = "<p class="textStyle">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<p class="textStyle">Aliquam mauris diam, gravida eget finibus varius.</p>";
这是我到目前为止所尝试的内容:
<?php
$content = "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<p>Aliquam mauris diam, gravida eget finibus varius.</p>";
$pattern = "/(<p)/";
$replace = '<p class="textStyle"';
preg_replace($pattern, $replace, $content);
?>
答案 0 :(得分:4)
如果您必须使用正则表达式,您可以尝试这样的事情。它与DOM操作的能力不匹配(请参阅下面的其余答案),但如果您确定<p>
标记在没有任何现有类的情况下是一致的,那么您可以尝试这样做:
$pattern = "/<p([> ])/";
$replace = '<p class="textStyle"$1';
$content = preg_replace($pattern, $replace, $content);
这将仅匹配<p>
和<p
,以便尝试保留您可能拥有的任何其他属性。但是,使用正则表达式很难正确处理更复杂的情况,例如<p id="row1" class="class1">
或q><p
(某些表情符号表面)。
对于更好的解决方案(不使用正则表达式),您可以改为执行以下操作。这是优越的原因是因为您还可以替换类属性,并自动维护其他属性。另外,如果存在HTML验证错误,DOMDocument
对象会记录这些错误。
<?php
$content = "<p class=\"oldClass\">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<p style=\"color:red\">Aliquam mauris diam, gravida eget finibus varius.</p>";
$dom = new DOMDocument();
$dom->loadHTML($content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
// Evaluate P tags in HTML. This just shows
// that you can be more selective on your tags
$xpath = new DOMXPath($dom);
$tags = $xpath->evaluate("//p");
// Loop through all the found tags
foreach ($tags as $tag) {
// Set class attribute
$tag->setAttribute("class", "textStyle");
}
// Save the HTML changes
$content = $dom->saveHTML();
<强>结果:强>
<p class="textStyle">Lorem ipsum dolor sit amet, consectetur adipiscing elit.
<p style="color:red" class="textStyle">Aliquam mauris diam, gravida eget finibus varius.</p></p>
特别注意这一点:
loadHTML($content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
如果没有这个,你将结束HTML包装器标签。
答案 1 :(得分:3)
以下是使用DOM的方法:
<?php
$DOM = new DOMDocument();
$DOM->loadHTML("<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>\n<p>Aliquam mauris diam, gravida eget finibus varius.</p>");
$list = $DOM->getElementsByTagName('p');
foreach($list as $p){
$p->setAttribute('class', 'textStyle');
}
$DOM=$DOM->saveHTML();
echo $DOM;
请参阅demo
答案 2 :(得分:0)
它有效但你必须这样做:
$content = preg_replace($pattern, $replace, $content);
答案 3 :(得分:-1)
试试这个:
$pattern = "/<p/";
$replace = '<p class="textStyle"';
preg_replace($pattern, $replace, $content);