preg_replace удаляет только часть строки, а оставшуюся часть использует PHP - PullRequest
0 голосов
/ 03 августа 2010

Я пытаюсь сделать замену внутри строки в PHP.Как удалить часть, которая есть только в группе в PHP?

<font.+?(size.+?.)>

Я хочу удалить size = x, где бы он ни находился. Проблема в том, что я не могу заставить работать функцию

 $text = preg_replace("<font.+?(size.+?.)>","",$text);

.

Пример источникаэто

<font style="background-color: rgb(255, 255, 0);" size="2"><strong><u>text</u></strong></font>
<font size="2">more text</font>

в это

<font style="background-color: rgb(255, 255, 0);" ><strong><u>text</u></strong></font>
<font>more text</font>

Я пытаюсь сказать.Везде, где есть тег шрифта, и если я увижу размер, то удалите атрибут размера, но оставьте все остальное без изменений.

Ответы [ 3 ]

4 голосов
/ 03 августа 2010
$dom = new DOMDocument();
$dom->loadHTML($htmlstring);
$x = new DOMXPath($dom);
$list = $x->query('//font/@size');
for($i = $list->length-1;$i>=0;$i--){
    $attr = $list->item($i);
    $attr->ownerElement->removeAttributeNode($attr);
}
1 голос
/ 05 августа 2010

Не лучшее решение, но ответить на ваш вопрос:

$html = <<<END
<font style="background-color: rgb(255, 255, 0);" size="2"><strong><u>text</u></strong></font>
<font size="2">more text</font>
END;

$text = preg_replace('/(<font.*?)(size\s*=[^\s>]*)([^>]*)>/si', '\1\3>', $html);
var_dump($text);
1 голос
/ 03 августа 2010

Regex - плохой способ выполнения HTML-манипуляций, но, тем не менее, общий метод для такого сопоставления регулярных выражений и частичной замены состоит в том, чтобы соответствовать:

(<font.+?)(size.+?.)(>)
\________/\________/\_/
    1         2      3

И затем заменить на

$1$3

Это заменяет обратные ссылки на замену тем, что соответствовало группе 1 и группе 3, исключая группу 2, фактически удаляя совпадение с группой 2.

Ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...