PHP用一些类将div替换为带有addtional属性的p

时间:2017-10-21 21:21:58

标签: php replace preg-replace str-replace

目前我使用的是preg_raplace,我尝试将所有p标记替换为class="para",并将div替换为addtional属性.. problerm;它不会使用class="para"更改所有p标记。

My codes in PHP FIDDLE FOR LIVE TEST

以下是我的代码。

    <?php

// your code goes here

$content = '
<p class="para">My first paragraph</p>

<p class="para">bansbnabsna</p>

<p class="para">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse non augue vitae elit vehicula condimentum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas varius nunc massa, id dictum urna auctor nec. Cras ut urna at sapien volutpat interdum posuere sed metus. Duis vel egestas turpis. Mauris maximus aliquam pellentesque. Mauris dapibus nisi non ante aliquet pretium. Cras vitae nisi pellentesque, ullamcorper nisi vitae, malesuada ante. Phasellus scelerisque congue diam ac cursus. Nullam arcu leo, condimentum sit amet elementum in, blandit blandit dui. Phasellus dignissim, nibh non aliquet facilisis, augue urna porta odio, eu porta neque purus a purus. Sed sollicitudin ut magna vitae lacinia. Mauris venenatis justo nisi, nec interdum nisl lobortis non. Aenean a dictum nisi, sed mollis massa. Praesent ut aliquet dui.
</p>

<p class="para">Nulla et tristique erat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Integer volutpat nibh bibendum condimentum elementum. Duis tempor porta lobortis. Aenean mollis diam a justo condimentum, in iaculis leo ornare. Quisque ultrices pulvinar tortor a tempor. Ut et finibus ipsum. Vivamus nec interdum magna. Fusce dignissim laoreet libero sit amet lacinia. Mauris varius erat odio, a porta sapien pulvinar ut. Aliquam pretium arcu at nulla lobortis, eu ultrices ipsum porta. Quisque viverra ullamcorper elit ac scelerisque. Phasellus scelerisque laoreet laoreet. Nulla mattis sed ligula nec tempor. Vivamus condimentum nisi sit amet congue molestie. Nunc posuere id tellus et tincidunt.
</p>

<p class="para">Etiam sodales magna dui, et suscipit erat egestas non. Integer a malesuada nunc. Sed pharetra justo nec odio posuere, quis pellentesque massa fringilla. Donec dui metus, porttitor eget lacinia eget, consequat in est. Vestibulum id sapien quis est ultrices rutrum at id purus. Duis ac odio a metus ultricies varius sed a neque. Vestibulum porttitor tortor consequat fermentum viverra. Quisque convallis ex eu risus placerat tempus at vitae leo. Sed vel ante sit amet justo rhoncus convallis. Praesent lobortis lobortis fermentum. Sed sapien velit, bibendum aliquam nibh vitae, porttitor egestas odio.
</p>

<p class="para">Aliquam fermentum arcu nec dapibus dictum. Duis egestas turpis eu finibus ullamcorper. Fusce dictum sed leo hendrerit pretium. Morbi finibus sem tortor, at tristique mauris sodales placerat. Vestibulum auctor, nisi et pellentesque porttitor, lectus leo facilisis turpis, in iaculis ligula arcu eget urna. Vestibulum fermentum luctus lobortis. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nam rhoncus mollis consectetur. Fusce sagittis eros lacus, eu aliquam nisi ultricies ac. Sed sit amet lacinia ante. Quisque congue, tortor ac pretium volutpat, nisi nisi laoreet elit, id condimentum ex sapien at urna. Cras sollicitudin malesuada commodo. Integer rutrum sapien non lacinia lacinia. Sed aliquet massa vel erat auctor, quis malesuada felis mollis.
</p>

<p class="para">Proin eu ipsum sem. Sed sagittis arcu nec justo pulvinar, a suscipit magna pulvinar. Nullam ullamcorper est nec dui fringilla, ullamcorper ornare massa semper. Nulla sed ipsum lacus. Vivamus ut imperdiet magna. Nullam nec malesuada quam. Duis facilisis quis lorem eget laoreet. Fusce quis leo ultricies, ullamcorper diam eget, iaculis magna. Nulla nec nisi sit amet arcu dignissim suscipit a eget felis. Sed sagittis accumsan cursus. Mauris pharetra nunc ex, in dignissim lectus mattis et. Maecenas sit amet velit ac nisl fringilla rhoncus vitae a quam. Praesent in placerat nisi. Maecenas suscipit, odio non pretium pellentesque, tortor metus commodo nibh, faucibus egestas urna ex sit amet magna. Sed aliquet, mi non faucibus bibendum, erat eros consectetur dolor, vitae iaculis magna sem eget leo. Aliquam quis lorem finibus turpis pellentesque pulvinar.</p>
';

function format_content_as_editor($str){
    if($str){
      return
      //preg_replace('/(\r\n|\n|\r){3,}/', "$1$1",
      str_replace('<br/>', '',
      str_replace('<br>', '',
      preg_replace('/<p [^<]*?class="([^<]*?para.*?)">(.*?)<\/p>/','<div class="$1" contenteditable="true" autocomplete="off">$2</div>',
      $str
      )
      )
      //)
      );
   } else {
      return  '<div class="para" contenteditable="true" autocomplete="off">Start writing..</div>';
   }
  }

  print_r(format_content_as_editor($content));

1 个答案:

答案 0 :(得分:0)

它无法正常工作的原因是因为您正在测试的某些HTML标记中存在换行符,并且正则表达式中的.*与垂直空白(换行符)不匹配。要解决此问题,请将/s修饰符添加到正则表达式中。请参阅:http://php.net/manual/en/reference.pcre.pattern.modifiers.php

  

s(PCRE_DOTALL)如果设置了此修饰符,则表示中的点元字符   pattern匹配所有字符,包括换行符。没有它,   新线被排除在外。此修饰符等效于Perl's / s   修改。诸如[^ a]的否定类总是匹配换行符   字符,与此修饰符的设置无关。

以下是使用/s修饰符以及/i修饰符的功能稍微更清晰的版本,因此它也不是case敏感匹配,因为不应考虑HTML标记caSe ,HTML标签不是caSe敏感的。因此,两个修饰符一起是/is

<?php
function format_content_as_editor($str)
{
    $str = trim((string) $str);

    if (!$str) { // If empty.
        return  '<div class="para" contenteditable="true" autocomplete="off">Start writing..</div>';
    }
    // Strip <br>, <BR>, <Br>, <br/>, <br />, etc.
    $str = preg_replace('/\<br\s*\/?\>/i', '', $str);

    // Replace all <p class="para" ...>[content]</p>.
    $str = preg_replace('/\<p\s+class\s*\=\s*(["\'])para\\1([^>]*)\>(.*?)\<\/p\>/is', '<div class="para"$2 contenteditable="true" autocomplete="off">$3</div>', $str);

    return $str;
}

所以你可以使用我的代码,或者只是改变你自己的功能:

function format_content_as_editor($str){
    if($str){
      return
      //preg_replace('/(\r\n|\n|\r){3,}/', "$1$1",
      str_replace('<br/>', '',
      str_replace('<br>', '',
      preg_replace('/<p [^<]*?class="([^<]*?para.*?)">(.*?)<\/p>/s','<div class="$1" contenteditable="true" autocomplete="off">$2</div>',
      $str
      )
      )
      //)
      );
   } else {
      return  '<div class="para" contenteditable="true" autocomplete="off">Start writing..</div>';
   }
  }

为您突出显示带有/s标记的正则表达式模式:
'/<p [^<]*?class="([^<]*?para.*?)">(.*?)<\/p>/s'

相关问题