Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Замена текста вне некоторых тегов

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
voodoo_dn
Отправлено: 22 Августа, 2014 - 10:07:35
Post Id


Новичок


Покинул форум
Сообщений всего: 12
Дата рег-ции: Янв. 2014  


Помог: 0 раз(а)




Добрый день!

Мне надо заменить некоторое слово в тексте, которое не будет находиться в теге <a>, <h1-6>, <img> и в атрибуте элемента.
Пример:
<a>REPLACEMENT_TEXT</a> - не заменяет
<a href/class/id/...="REPLACEMENT_TEXT.com/..."></a> - не заменяет(т.е. если слово для замены является атрибутом - тоже не заменяем)
<h1>REPLACEMENT_TEXT</h1> - не заменяем
<img src="REPLACEMENT_TEXT.com/..."> - тоже не заменяем
а к примеру
<div id="..."><span>REPLACEMENT_TEXT</span></div> - это заменяем

Помогите пожалуйста, уже который день морочусь с этой задачей.
 
 Top
Tyoma5891
Отправлено: 22 Августа, 2014 - 10:12:26
Post Id


Частый посетитель


Покинул форум
Сообщений всего: 621
Дата рег-ции: Авг. 2013  


Помог: 5 раз(а)




код свой покажите который вы написали для решения этой задачи?
 
 Top
voodoo_dn
Отправлено: 22 Августа, 2014 - 10:40:54
Post Id


Новичок


Покинул форум
Сообщений всего: 12
Дата рег-ции: Янв. 2014  


Помог: 0 раз(а)




$pattern = "/<($avoid_list)[^>]*>[^<]+<\/($avoid_list)>\K(*SKIP)(*FAIL)|$replace_item->find_text/iu";
$replace = "<a href='$replace_item->replace_text'>$replace_item->find_text</a>";
$body = preg_replace($pattern, $replace, $body);

$avoid_list = 'a|h[1-6]|img';
 
 Top
Tyoma5891
Отправлено: 22 Августа, 2014 - 10:50:25
Post Id


Частый посетитель


Покинул форум
Сообщений всего: 621
Дата рег-ции: Авг. 2013  


Помог: 5 раз(а)




voodoo_dn пишет:
$pattern = "/<($avoid_list)[^>]*>[^<]+<\/($avoid_list)>\K(*SKIP)(*FAIL)|$replace_item->find_text/iu";
$replace = "<a href='$replace_item->replace_text'>$replace_item->find_text</a>";
$body = preg_replace($pattern, $replace, $body);

$avoid_list = 'a|h[1-6]|img';

это какой-то фрагмент кода не понятный совсем!
Вам нужно воспользоваться либо составлением правильного регулярного выражения и писать парсер самому, либо готовыми парсерами типа PHP Simple HTML DOM Parser
 
 Top
Мелкий Супермодератор
Отправлено: 22 Августа, 2014 - 11:10:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Помучайте вот этот вариант:
PHP:
скопировать код в буфер обмена
  1. preg_replace('~(^|[^<]++|<(?!a|img|h[1-6])[^>]++>)REPLACEMENT_TEXT~', '\\1TEXT', $sInput);

Вроде бы не накосячил.


-----
PostgreSQL DBA
 
 Top
voodoo_dn
Отправлено: 22 Августа, 2014 - 13:55:29
Post Id


Новичок


Покинул форум
Сообщений всего: 12
Дата рег-ции: Янв. 2014  


Помог: 0 раз(а)




Мелкий, не работает =/
 
 Top
Мелкий Супермодератор
Отправлено: 22 Августа, 2014 - 14:06:06
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




voodoo_dn, это не описание.
PHP:
скопировать код в буфер обмена
  1. function pcrereplace($sInput) {
  2.         return preg_replace('~(^|[^<]++|<(?!a|img|h[1-6])[^>]++>)REPLACEMENT_TEXT~', '\\1TEXT', $sInput);
  3.         }
  4.  
  5. $rgAsserts = array(
  6.         'REPLACEMENT_TEXT' => 'TEXT',
  7.         '<a>REPLACEMENT_TEXT</a>' => '<a>REPLACEMENT_TEXT</a>',
  8.         '<a href/class/id/...="REPLACEMENT_TEXT.com/..."></a>' => '<a href/class/id/...="REPLACEMENT_TEXT.com/..."></a>',
  9.         '<h1>REPLACEMENT_TEXT</h1>' => '<h1>REPLACEMENT_TEXT</h1>',
  10.         '<img src="REPLACEMENT_TEXT.com/...">' => '<img src="REPLACEMENT_TEXT.com/...">',
  11.         '<div id="..."><span>REPLACEMENT_TEXT</span></div>' => '<div id="..."><span>TEXT</span></div>'
  12. );
  13.  
  14. foreach ($rgAsserts as $sInput => $sOutput) {
  15.         $sRealOut = pcrereplace($sInput);
  16.         if ($sRealOut != $sOutput) {
  17.                 echo 'assert fail',PHP_EOL;
  18.                 echo $sInput, ' real out '.$sRealOut, PHP_EOL;
  19.                 echo PHP_EOL;
  20.                 }
  21.         }

Тестовые данные прошли.


-----
PostgreSQL DBA
 
 Top
voodoo_dn
Отправлено: 22 Августа, 2014 - 15:15:24
Post Id


Новичок


Покинул форум
Сообщений всего: 12
Дата рег-ции: Янв. 2014  


Помог: 0 раз(а)




Мелкий, а что означает ++? [^<]++, это повторение участка [^<]+?
 
 Top
Мелкий Супермодератор
Отправлено: 22 Августа, 2014 - 16:35:29
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Нет, это захватывающие квантификаторы. В этой регулярке можно безболезненно заменить на [^<]+
Использовано для оптимизации работы регулярки, но чем буду пересказывать, лучше прочитать "Регулярные выражения" Дж.Фриддл. (отличие маленькое, но чтобы его объяснить, придётся пересказать механику работы регулярок)


-----
PostgreSQL DBA
 
 Top
voodoo_dn
Отправлено: 22 Августа, 2014 - 17:16:02
Post Id


Новичок


Покинул форум
Сообщений всего: 12
Дата рег-ции: Янв. 2014  


Помог: 0 раз(а)




Мелкий, большое спасибо, выручил. Если честно, перепробовал кучу регулярок, твоя тоже была, но на http://regex101[dot]com/ она не запустилась =/
В общем, спасибо)
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB