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
Форумы портала PHP.SU :: Версия для печати :: Замена текста вне некоторых тегов
Форумы портала PHP.SU » PHP » Регулярные выражения » Замена текста вне некоторых тегов

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

1. voodoo_dn - 22 Августа, 2014 - 10:07:35 - перейти к сообщению
Добрый день!

Мне надо заменить некоторое слово в тексте, которое не будет находиться в теге <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> - это заменяем

Помогите пожалуйста, уже который день морочусь с этой задачей.
2. Tyoma5891 - 22 Августа, 2014 - 10:12:26 - перейти к сообщению
код свой покажите который вы написали для решения этой задачи?
3. voodoo_dn - 22 Августа, 2014 - 10:40:54 - перейти к сообщению
$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';
4. Tyoma5891 - 22 Августа, 2014 - 10:50:25 - перейти к сообщению
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
5. Мелкий - 22 Августа, 2014 - 11:10:33 - перейти к сообщению
Помучайте вот этот вариант:
PHP:
скопировать код в буфер обмена
  1. preg_replace('~(^|[^<]++|<(?!a|img|h[1-6])[^>]++>)REPLACEMENT_TEXT~', '\\1TEXT', $sInput);

Вроде бы не накосячил.
6. voodoo_dn - 22 Августа, 2014 - 13:55:29 - перейти к сообщению
Мелкий, не работает =/
7. Мелкий - 22 Августа, 2014 - 14:06:06 - перейти к сообщению
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.         }

Тестовые данные прошли.
8. voodoo_dn - 22 Августа, 2014 - 15:15:24 - перейти к сообщению
Мелкий, а что означает ++? [^<]++, это повторение участка [^<]+?
9. Мелкий - 22 Августа, 2014 - 16:35:29 - перейти к сообщению
Нет, это захватывающие квантификаторы. В этой регулярке можно безболезненно заменить на [^<]+
Использовано для оптимизации работы регулярки, но чем буду пересказывать, лучше прочитать "Регулярные выражения" Дж.Фриддл. (отличие маленькое, но чтобы его объяснить, придётся пересказать механику работы регулярок)
10. voodoo_dn - 22 Августа, 2014 - 17:16:02 - перейти к сообщению
Мелкий, большое спасибо, выручил. Если честно, перепробовал кучу регулярок, твоя тоже была, но на http://regex101[dot]com/ она не запустилась =/
В общем, спасибо)

 

Powered by ExBB FM 1.0 RC1