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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> замена слов, не заключенных в определенные теги, регулярное выражение 
:(
    Опции темы
spamoney
Дата 25.10.2008, 04:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте, помогите составить регулярное выражение, допустим есть текст:
Код
$text="<tr>СЛОВО9<td><a href='#'>СЛОВО1-СЛОВО8</a>СЛОВО1-СЛОВО3-СЛОВО5<strong>СЛОВО1</strong>СЛОВО2</td></tr>";


также есть набор ключевых слов через запятую:
Код
$keywords="СЛОВО1, СЛОВО3, СЛОВО8";




Необходимо, сделать так, что бы каждое ключевое слово в тексте заменялось допустим на NEWSLOVO, только в том случае если оно не заключено в тэги <a></a> и <strong></strong> , т.е исходный текст получится таким:

Код
$text="<tr>СЛОВО9<td><a href='#'>СЛОВО1-СЛОВО8</a>NEWSLOVO-NEWSLOVO-СЛОВО5<strong>СЛОВО1</strong>СЛОВО2</td></tr>";

PM MAIL   Вверх
unicross
Дата 25.10.2008, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 5
Всего: 53



spamoney, сомневаюсь, что кто-нибудь напишет такую регулярку...

Как вариант:
Код

<?php
$text="<tr>СЛОВО9<td><a href='#'>СЛОВО1-СЛОВО8</a>СЛОВО1-СЛОВО3-СЛОВО5<strong>СЛОВО1</strong>СЛОВО2</td></tr>";
$keyword=array("СЛОВО1", "СЛОВО3", "СЛОВО8");
// Слова для замены
$replace = array("NEWSLOVO1", "NEWSLOVO2", "NEWSLOVO3");
// Временные слова
$replace_tmp = array("NEW_SLOVO1", "NEW_SLOVO2", "NEW_SLOVO3");
if (count($keyword) != count($replace) || count($keyword) != count($replace_tmp)) {
   echo "Ошибка";
   exit;
}
echo 'Исходная строка<BR>';
echo htmlspecialchars($text);
$pattern = '#(<a [^>]+>)(.*?)(</a>)#is';
$text = preg_replace_callback($pattern, "f_replace", $text);
$pattern = '#(<strong>)(.*?)(</strong>)#is';
$text = preg_replace_callback($pattern, "f_replace", $text);
$count = count($keyword);
for ($i=0; $i<$count; $i++) {
   $text = str_replace($keyword[$i], $replace[$i], $text);
}
for ($i=0; $i<$count; $i++) {
   $text = str_replace($replace_tmp[$i], $keyword[$i], $text);
}
echo '<BR>Строка после замены<BR>';
echo htmlspecialchars($text);

function f_replace($arr) {
   global $keyword;
   global $replace_tmp;
   $count = count($keyword);
   for ($i=0; $i<$count; $i++) {
      $arr[2] = str_replace($keyword[$i], $replace_tmp[$i], $arr[2]);
   }
   $repl = $arr[1] . $arr[2] . $arr[3];
   return $repl;
}
?>

Выведет
Код

Исходная строка
<tr>СЛОВО9<td><a href='#'>СЛОВО1-СЛОВО8</a>СЛОВО1-СЛОВО3-СЛОВО5<strong>СЛОВО1</strong>СЛОВО2</td></tr>
Строка после замены
<tr>СЛОВО9<td><a href='#'>СЛОВО1-СЛОВО8</a>NEWSLOVO1-NEWSLOVO2-СЛОВО5<strong>СЛОВО1</strong>СЛОВО2</td></tr>

Данный вариант не идеаден, т.к.:
1. Функция str_replace() зависит от регистра символов.
2. Будут заменены не только целые слова, но и все вхождения подстроки.
3. В исходной строке могут встречаться слова из списка $replace_tmp

Это сообщение отредактировал(а) unicross - 25.10.2008, 10:53
PM MAIL WWW   Вверх
krundetz
Дата 25.10.2008, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 1
Всего: 69



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

Это сообщение отредактировал(а) krundetz - 25.10.2008, 11:03


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
unicross
Дата 25.10.2008, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 5
Всего: 53



spamoney, вот еще вариант
Код

<?php
$text = "СЛОВО8<tr>СЛОВО9<td><a href='#'>СЛОВО1-СЛОВО8</a>СЛОВО1-\"СЛОВО3\"-слово1-СЛОВО5-СЛОВО1СЛОВО5<strong>СЛОВО1</strong>СЛОВО2</td></tr>";
$keyword = array("СЛОВО1", "СЛОВО3", "СЛОВО8");
// Слова для замены
$replace = array("NEWSLOVO1", "NEWSLOVO3", "NEWSLOVO8");
$count_key = count($keyword);
if ($count_key != count($replace)) {
   echo "Ошибка";
   exit;
}
echo 'Исходная строка<BR>';
echo htmlspecialchars($text);
preg_match_all('#(?:(<[^>]*?>)|^)([^<]*)#', $text, $arr, PREG_PATTERN_ORDER);
$str = "";
$flag = 0;
$count = count($arr[0]);
for ($i=0; $i<$count; $i++) {
   $str .= $arr[1][$i];
   if (!preg_match("#(^<a )|(^<strong)#i", $arr[1][$i])) {
      if (preg_match("#(^</a>)|(^</strong>)#i", $arr[1][$i])) {
         $flag = 0;
      }
      if (strlen($arr[2][$i])>0 && $flag == 0) {
         for ($j=0; $j<$count_key; $j++) {
            $arr[2][$i] = f_str_replace($keyword[$j], $replace[$j], $arr[2][$i]);
         }
      }
   }
   else {
      $flag = 1;
   }
   $str .= $arr[2][$i];
}
echo '<BR>Строка после замены<BR>';
echo htmlspecialchars($str);

function f_str_replace($key, $rep, $stroka) {
   // Замена обособленного слова
   $pattern = "#(?<=\s|^|[>\"'-])" . $key . "(?=\s|$|[,.?!<\"'-])#si";
   return preg_replace($pattern, $rep, $stroka);
}
?>



Это сообщение отредактировал(а) unicross - 25.10.2008, 15:35
PM MAIL WWW   Вверх
spamoney
Дата 26.10.2008, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

почему ты решил что кто то за тебя здесь будет ее писать?


Цитата

ты же написал что тебе надо но не хочеш прикладывать собственных усилий


krundetz, а почему сразу на ты? Мы разве знакомы? С чего Вы взяли, будто бы я решил, что кто-то должен за меня её писать? Я просто попросил помочь написать регулярное выражение (не весь скрипт, а всего лишь саму регулярку), т.к если б я сам смог его составить, то, надо полагать, наврядли бы обратился сюда за помощью...


unicross, Огромное спасибо Вам за помощь!

P.S
krundetz, когда Вы будете не так заняты помощью участникам форума, откройте, пожалуйста, учебник русского языка, и прочтите пару параграфов на тему: "Орфография", а то она у Вас уж больно хромает...

Это сообщение отредактировал(а) spamoney - 26.10.2008, 15:18
PM MAIL   Вверх
bobik02
Дата 27.10.2008, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 14



Цитата(spamoney @  26.10.2008,  15:11 Найти цитируемый пост)
krundetz, когда Вы будете не так заняты помощью участникам форума, откройте, пожалуйста, учебник русского языка, и прочтите пару параграфов на тему: "Орфография", а то она у Вас уж больно хромает...

spamoney, Не переходите пожалуйста на личности. Точно также Вам можно заявить что у вас хромает знания регулярных выражений, и посоветовать прочитать в учебнике пару тем по регулярным выражениям.  smile 



--------------------
Have a nice day
PM   Вверх
krundetz
Дата 27.10.2008, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 1
Всего: 69



spamoney, что ж извини если обидел. Просто когда кто то в чем то просит помочь он обычно паказывает как он пытался решить задачу а не банально приводит исходные данные и конечные.


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




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


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

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