LINUX.ORG.RU

Поиск текста в файле.

 ,


0

1

Задача: необходимо найти в тексте текст и заменить его на другой.
В принципе, с этим хорошо справится preg_replace:

preg_replace("/$searchFor/",$replaceTo,$sourceText)

Но, по хорошему, если у нас в исходном тексте изменилось только форматирование (добавились табы, пробелы, символы новой строки и прочее невидимое), то этот текст тоже стоит находить и менять на новый.
Изначально мысль была в $sourceText заменить все символы на одинарный пробел, в $searchFor заменить, а потом вызвать preg_replace. Но тогда в итоге получится какой-то неправильный однострочник.
Вот как это сделать по нормальному?


$search  = 'The text to replace';
$pattern = '/'.str_replace(' ', '[\s\t\r\n]+', preg_quote($search)).'/mu';
gatsu
()

Изначально мысль была в $sourceText заменить все символы на одинарный пробел, в $searchFor заменить, а потом вызвать preg_replace. Но тогда в итоге получится какой-то неправильный однострочник.

почему «неправильный»? так оно и надо делать, если вы пользуетесь для поиска/замены str_replace() (это в разы быстрее чем preg_replace()), но если вы таки хотите preg_replace(), то выполните

$pattern = preg_replace('/\s+/', '\s+', $pattern);

drBatty ★★
()
Ответ на: комментарий от drBatty

так оно и надо делать

Да, точно, это я не до конца подумал. Получилось:

$text = "
some text at the beginning

text to replace
in two lines

some text at the end
";
$pattern = "text to replace
in two lines";
$newText = "text has been replaced";
$pattern = '/'.preg_replace('/\s+/','\s+',$pattern).'/ms';

echo "<pre>";
echo preg_replace($pattern,$newText, $text);
echo "</pre>";

spdooh
() автор топика
Ответ на: комментарий от drBatty

Ну а скорость - не сильно важна, это единичное действие - внесение изменений в код, чтоб установить расширение.

spdooh
() автор топика
Ответ на: комментарий от spdooh

spdooh

Ну а скорость - не сильно важна

тут ещё один момент тонкий есть: можно вбить что-нить типа $pattern = «2 + 2 = 4», и у вас это не сработает, потому как плюс (+) для preg_replace() имеет особый смысл.

drBatty ★★
()
Ответ на: комментарий от spdooh

spdooh

$pattern = '/'.preg_replace('/\s+/','\s+',$pattern).'/ms';

а зачем /ms?

drBatty ★★
()
Ответ на: комментарий от drBatty

потому как плюс (+) для preg_replace()

Тогда так:
[code=php]$pattern = '/'.preg_replace('/\s+/','\s+',preg_quote($pattern)).'/';[/code]

а зачем /ms?

У гатсу скопировал)

spdooh
() автор топика
Ответ на: комментарий от spdooh

spdooh

Тогда так

ну можно конечно и так, но зачем так заморачиваться?

spdooh

а зачем /ms?

У гатсу скопировал)

у него таки mu

drBatty ★★
()
Ответ на: комментарий от drBatty

зачем так заморачиваться?

Чтоб работало чаще. Тем более - мало ли какие знаки будут в сорцах

у него таки mu

точно, был не прав

spdooh
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.