Как мне заменить * на * с помощью PHP preg_replace?

#php #html #regex

#php #HTML #регулярное выражение

Вопрос:

Попытка регулярного выражения в HTML-файле со следующим кодом:

 <body style=""><p class="Normal" style="direction:ltr;unicode-bidi:normal;"><span class="Normal-H"><span class="-H" style="font-weight:bold;"></span><span class="-H" style="font-weight:bold;">Some bold text</span></span></p><p class="Normal" style="direction:ltr;unicode-bidi:normal;"><span class="Normal-H"><span class="-H" style="font-style:italic;"></span><span class="-H" style="font-style:italic;">Some italic text</span></span></p></body></html>
  

Обратите внимание на <span class="-H" style="font-weight:bold;">Some bold text</span>

В настоящее время я использую PHP preg_replace '/<span class="-H" style="font-style:italic;">(.*?)</span>/' для замены, поскольку <strong>Some bold text</strong> , однако, это ограничено spans классом "-H"

Как я могу заменить любой экземпляр <span> , который включает атрибут style="font-weight:bold;" с <strong>Bold text</strong> ?

Спасибо

Ответ №1:

Ваше регулярное выражение должно быть:

 %^(<span(.*?)style="font-weight:bold;"(.*?)>(.*?)</span>)$% // % is the delimeter.
  

Вы должны поместить текст в строгий тег следующим образом:

 <strong>$4</strong>
  

Проверено на http://www.regular-expressions.info/javascriptexample.html

 $text = '<span class="-H" style="font-weight:bold;">Some bold text</span>';
$regex = '%^(<span(.*?)style="font-weight:bold;"(.*?)>(.*?)</span>)$%';
$replace = '<strong>$4</strong>';
echo preg_replace($regex, $replace, $text);
  

Комментарии:

1. Спасибо onatm — отлично работает, немного изменил для моих точных требований и других вариантов использования

Ответ №2:

регулярное выражение может быть очень сложным. но как насчет этого решения?

 $element = simplexml_load_string('<span class="-H" style="font-weight:bold;">Some boldtext</span>');
$attributes = $element->attributes();

echo strpos($attributes->class, ':') ? strstr($attributes->class, ':', false) : $attributes->class;
echo $element;
  

Комментарии:

1. Спасибо, Кевин, я выбрал решение onatm, но буду учитывать ваше для будущих сценариев

Ответ №3:

Вместо регулярного выражения вы можете использовать анализатор DOM, например DOMDocument , для замены правильных <span> тегов <strong> тегами. Это может быть проще в использовании / адаптации, чем регулярное выражение.

 <?php
$dom = new DOMDocument;
@$dom->loadHTML('<body style=""><p class="Normal" style="direction:ltr;unicode-bidi:normal;"><span class="Normal-H"><span class="-H" style="font-weight:bold;"></span><span class="-H" style="font-weight:bold;">Some bold text</span></span></p><p class="Normal" style="direction:ltr;unicode-bidi:normal;"><span class="Normal-H"><span class="-H" style="font-style:italic;"></span><span class="-H" style="font-style:italic;">Some italic text</span></span></p></body></html>');
$xPath = new DOMXPath($dom);
$spans = $xPath->query('//span');
foreach($spans as $span){
  if($span->hasAttribute('style')){
    if(strstr($span->getAttribute('style'), 'font-weight:bold') !== FALSE){
      $newSpan = $dom->createElement('strong', $span->nodeValue);
      $span->parentNode->replaceChild($newSpan, $span);
    }
  }
}
echo $dom->saveHTML();
  

ДЕМОНСТРАЦИЯ: http://codepad.org/bIyAlXUf

Ответ №4:

Я думаю, что вы можете получить соответствующий результат, который приведен ниже,

 $text    = '<span class="-H" style="font-weight:bold;">Some bold text</span>';
$regex   = '/<span(.*?)style="font-weight:bold;"(.*?)>(.*?)</span>/gi'; //if you use only first 
$replace = '<strong>$4</strong>';
echo preg_replace($regex, $replace, $text);