Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Заменить все теги <font> на <h>. Регулярное выражение 
:(
    Опции темы
Наставник
  Дата 28.7.2005, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 4.11.2004

Репутация: 2
Всего: 15



Уважаемые коллеги подскажите, как правильно сформировать регулярное выражение.

Надо выделить все теги<font> в html файле и заменить их на <h>, такого размера, который указан в аргументе size тега <font>.

Вот вариант тега <font>
Код

<FONT size=2>Вне зависимости от стиля сайта и CSS.</FONT>

Для этого варианта довольно все просто
Код

$content = preg_replace("/<font size=2>(.*)<\/font>/i", “<H2>\\1</H>", $content);


Тег <font> может также иметь вид
Код

<FONT face="Courier New, Courier, mono" color=#000099 size=4>То есть все соответствует дизайну</FONT>

Вопрос, как мне узнать чему равен параметр size, и по нему сформировать соответсвующий тег <h1> - <h6>, при этом структура тега font имеет вид <font (.*) size=(1 | 2 | 3 | 4 | 5 | 6)></font>

Спасибо.

Это сообщение отредактировал(а) Наставник - 28.7.2005, 16:18


--------------------
Богатство языка определяет широту мысли
Персональный сайт >>
PM MAIL WWW   Вверх
Mal Hack
Дата 28.7.2005, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Код
<?php
      $content=<<<TET

<FONT face="Courier New, Courier, mono" color=#000099 size=4>Òî åñòü âñå ñîîòâåòñòâóåò äèçàéíó</FONT>
TET;

print $content = preg_replace("#<font.+size=([1-6]+).*>(.*)<\/font>#i", "<H\\1>\\2</H\\1>", $content);

?>

PM ICQ   Вверх
Bikutoru
Дата 28.7.2005, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 8
Всего: 22



Прошу заметить, что допустимо <font size="1"> или <font size='1'> и не допустимо <font-size=1>. Так что, наверное, лучше будет так
Код

print $content = preg_replace("#<font.*\ssize=['\"]?([1-6]+).*>(.*)<\/font>#i", "<H\\1>\\2</H\\1>", $content);


Это сообщение отредактировал(а) Bikutoru - 28.7.2005, 17:10


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Mal Hack
Дата 28.7.2005, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



тогда уж:
Код
<?php
      $content=<<<TET
<FONT face="Courier New, Courier, mono" color=#000099 size=4>Òî åñòü âñå ñîîòâåòñòâóåò äèçàéíó</FONT>
TET;
print $content = preg_replace("#<font.+size=(\"|\'|)?([1-6]+)\\1.*>(.*)<\/font>#i", "<H\\2>\\3</H\\2>", $content);
?>



Это сообщение отредактировал(а) Mal Hack - 28.7.2005, 17:15
PM ICQ   Вверх
Наставник
Дата 28.7.2005, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 4.11.2004

Репутация: 2
Всего: 15



1. Mal Hack спасибо. Кратко и ясно (от меня +).

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

Код

preg_replace("#<(font.+)size=([1-6]+).*>(.*)<\/font>#i", "<!-- \\3 -->\n<\\1><H\\2>\\3</H\\2></font>", $content)

А вот теперь доп. вопрос, можно ли как-нибудь ограничить количество символов (к примеру до 100), которые выводится в комментарии - <!-- \\3 -->, если не регулярное выражение, то можно было бы использовать такое выражение

Код

substr(ereg_replace("<[^>]*>","",(preg_replace("/\n|\r|\t|\r\n|\n\r/","",$text))),0,100);

// так "накручено", т.к. надо в комментарии выводить только текст, без тегов и спец. символов.

Так, вот как это встроить в регулярное выражение.

// Пытался выполнить рег. выражение с параметром /e - не заработало у меня, "руки ещё те".



--------------------
Богатство языка определяет широту мысли
Персональный сайт >>
PM MAIL WWW   Вверх
Mal Hack
Дата 28.7.2005, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Наставник
Лучше мой последний вариант заюзай.

Цитата
А вот теперь доп. вопрос, можно ли как-нибудь ограничить количество символов (к примеру до 100), которые выводится в комментарии - <!-- \\3 -->,

Это уже через callback вызов замены.
PM ICQ   Вверх
Наставник
Дата 28.7.2005, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 4.11.2004

Репутация: 2
Всего: 15



Цитата(Mal @ 28.7.2005, 17:17)
Это уже через callback вызов замены.

Хм, все же не понял вашего совета, что делать-то?


--------------------
Богатство языка определяет широту мысли
Персональный сайт >>
PM MAIL WWW   Вверх
Mal Hack
Дата 28.7.2005, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Цитата
Хм, все же не понял вашего совета, что делать-то?

http://php.net/preg_replace_callback
или:
Код
<?php
preg_replace("/(<\/?)(\w+)([^>]*>)/e", 
             "'\\1'.strtoupper('\\2').'\\3'", 
             $html_body);
?>

PM ICQ   Вверх
Bikutoru
Дата 28.7.2005, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 8
Всего: 22



Ну а если
Код

$content=<<<TET
<FONT-size=4>Oi anou ana niioaaonoaoao aecaeio</FONT>
TET;



--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Mal Hack
Дата 28.7.2005, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Bikutoru посмотри мой последний вариант, там как раз с size=4 smile
PM ICQ   Вверх
Bikutoru
Дата 28.7.2005, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 8
Всего: 22



Mal Hack, дело не size=4, а в font-size без пробела между словами. Твой рег пропускает примерно такое
<font-dsfdsfdsfdsfds-size=4></font>
Я тут поразмыслил, такое получилось:
Код

$content = preg_replace("#<font(?:\s.+)?\ssize=(\"|\'|)?([1-6]+)\\1.*>(.*)<\/font>#i", "<H\\2>\\3</H\\2>", $content);

Вроде работает...


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Mal Hack
Дата 28.7.2005, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Bikutoru тогда уж проще smile
Код
<?php
      $content=<<<TET
<FONT face="Courier New, Courier, mono" color=#000099 size=4>Òî åñòü âñå ñîîòâåòñòâóåò äèçàéíó</FONT>
TET;
print $content = preg_replace("#<font\s(?:.+\s)+size=(\"|\'|)?([1-6]+)\\1.*>(.*)<\/font>#i", "<H\\2>\\3</H\\2>", $content);
?>


PM ICQ   Вверх
Наставник
Дата 28.7.2005, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 4.11.2004

Репутация: 2
Всего: 15



В ИТОГЕ.

Получилась регулярное выражение, которое заменяет все теги вида <font (.*) size=(1|2|3|4|5|6)></font> на соответствующий тег <h((1|2|3|4|5|6))></h1>, также добавляет перед полученными тегом <h> комментарий из текста, заключенного в «бывший тег» <font>, ограниченный 150 символами.

Код

function restrictComment($matches) {
    return "<!-- ".substr(ereg_replace("<[^>]*>","",(preg_replace("/\n|\r|\t|\r\n|\n\r/","",$matches[1]))),0,150)." -->";
}

$content="index.html"; 

$content=preg_replace_callback('/<!-- (.*?) -->/','restrictComment',preg_replace("#<(font.+)size=([1-6]+).*>(.*)<\/font>#i", "<!-- \\3 -->\n<\\1><H\\2>\\3</H\\2></font>", $content));

echo($content);


Спасибо Mal Hack, Bikutoru.

Удачи.

Это сообщение отредактировал(а) Наставник - 28.7.2005, 18:38


--------------------
Богатство языка определяет широту мысли
Персональный сайт >>
PM MAIL WWW   Вверх
Bikutoru
Дата 28.7.2005, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 8
Всего: 22



Проще, да не проще
Код

<?php

$content=<<<TET
<FONT face="Courier New, Courier, mono"   color=#000099 size=1>Test #1</FONT>
<FONT face="Courier New, Courier, mono" color=#000099  size=2>Test #2</FONT>
<FONT  size=3>Test #3</FONT>
<FONT      size=4>Test #4</FONT>
<FONT-size=5>Test #5</FONT>

TET;

//Bikutoru's RegExp
$reg = "#<font\s(?:.*\s)?size=(\"|\'|)?([1-6]+)\\1.*>(.*)<\/font>#i";

//Mal Hack's RegExp
//$reg = "#<font\s(?:.+\s)+size=(\"|\'|)?([1-6]+)\\1.*>(.*)<\/font>#i";
print $content = preg_replace($reg, "<H\\2>\\3</H\\2>", $content);

?>

Раскомментируй свой рег smile
Добавлено @ 18:41
З.Ы. долго же я свой придумывал... Надо подучить эту тему...


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Mal Hack
Дата 28.7.2005, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Bikutoru
smile
Код
$reg = "#<font(.*)\ssize=(\"|\'|)?([1-6]+)\\2.*>(.*)<\/font>#i"; 


Наставник
что-то ты слишком умно завернул smile))
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1244 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.