使用PHP Regex为每个段落标记添加一个类

时间:2015-05-23 06:58:05

标签: php regex

$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);

?>

4 个答案:

答案 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(某些表情符号表面)。

DOM操作:

对于更好的解决方案(不使用正则表达式),您可以改为执行以下操作。这是优越的原因是因为您还可以替换类属性,并自动维护其他属性。另外,如果存在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);