Консультация № 172887
04.10.2009, 15:28
0.00 руб.
0 7 2
Здравствуйте.
Скажите пожалуйста какое надо составить регулярное выражение ,что бы в тексте , функцией preg_replace все отдельные слова такие как script , frame заменялись пробелами - в случае если это отдельные слова ,а не части слова (scripting, frameset ) , вне зависимости от регистра, и от количества пробелов между буквами - s cr i p t , ScrIpt FRA ME - так написанные слова тоже должны заменяться.

Обсуждение

Неизвестный
04.10.2009, 17:16
общий
это ответ
Здравствуйте, Dima1967!

Поскольку упоминается функция preg_replace(), то скорее всего вопрос задан применительно к php. Также поскольку предположительно количество слов подлежащих замене произвольно - с точки зрения лучшей поддерживаемости кода в дальнейшем логичнее не пихать их все в одно выражение, а сделать цикл по ним. В этом случае код мог бы выглядеть примерно так как показано в приложении.

Приложение:
<?php
$text = 'Some text about scripting and frameset, but script and f r a m e must be replaced with spaces.';
$words = array('script','frame');
foreach($words as $word)
{
$regexp = '/\b'.join('\s*',preg_split('/(.)/',$word,-1,PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE)).'\b/si';
$text = preg_replace($regexp,'',$text);
};
echo $text;
?>
5
Неизвестный
04.10.2009, 19:25
общий
Спасибо , с буквами нормально работает , но с символам < > \ не хочет - можно ,что то придумать ,что бы эти символы тоже вырезать?
Я использовал до этого txt = preg_replace("/>+|<+/",'',$txt); - это работало не пойму почему тут не заменяет....
Неизвестный
04.10.2009, 19:37
общий
Скорее всего проблема в том что эти символы в регулярных выражениях имеют специальное значение и соответственно их необходимо экранировать. Например вот так:
$chars = preg_split('/(.)/',$word,-1,PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
foreach($chars as $k=>$v)
$chars[$k] = preg_quote($v,'/');
$regexp = '/\b'.join('\s*',$chars).'\b/si';
Неизвестный
04.10.2009, 20:43
общий

$text = '<<< >>> Some text about scripting and frameset, but script and f r a m e must be replaced with spaces.';
$words = array('script','frame','yes','>','<');
foreach($words as $word)
{
$word= preg_quote($word,'/');
$regexp = '/\b'.join('\s*',preg_split('/(.)/',$word,-1,PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE)).'\b/si';

$text = preg_replace($regexp,'',$text );
};
Вот этот скрипт работает но он не заменяет < > - $word тут- экранируется - или я ,что то ни так делаю ?
Неизвестный
04.10.2009, 20:47
общий
В приведенном примере "<<<" нарушает изначально установленное условие "в случае если это отдельные слова ,а не части слова", ведь "<" для "<<<" - это как раз часть слова.
Неизвестный
04.10.2009, 21:17
общий
Ясно.
Неизвестный
05.10.2009, 10:40
общий
это ответ
Здравствуйте, Dima1967!
как-то так
preg_replace('/(\\s)s\\s?c\\s?r\\s?i\\s?p\\s?t(\\s)/i','$1 $2',$text);
если пробелов может быть больше одного,то возможно нужно будет заменить ? на *

Приложение:
<?php
$text="pscript ppostscript script scriptlet s c ri pt postsc r i pts s cr i p t , ScrIpt FRA ME SET 123";
$t1= preg_replace('/(\\s)s\\s?c\\s?r\\s?i\\s?p\\s?t(\\s)/i','$1 $2',$text);
$t2= preg_replace('/(\\s)f\\s?r\\s?a\\s?m\\s?e\\s?s\\s?e\\s?t(\\s)/i','$1 $2',$t1);
print $t2;
?>
4
Спасибо за ответ, но в ответе № 254990 лучше реализована возможность добавлять новые слова . Эта оценка - поставлена сравнительно с предыдущим ответом.
Форма ответа