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