preg_replace или str_replace
-
21-09-2019 - |
Вопрос
У меня есть кое-какой текст, что-то вроде этого:
Paragraphs of text
(SOME KNOWN TEXT)Unknown Text(SOME OTHER KNOWN TEXT)
Some additional paragraphs of text
Чего я хочу, так это сохранить Неизвестный Текст, но избавиться от (КАКОЙ-ТО ИЗВЕСТНЫЙ ТЕКСТ) и (КАКОЙ-ТО ДРУГОЙ ИЗВЕСТНЫЙ ТЕКСТ).
Я думаю, что preg_replace даст мне то, что я хочу, но мне нужно регулярное выражение, чтобы заменить это:
(SOME KNOWN TEXT)Unknown Text(SOME OTHER KNOWN TEXT)
с помощью этого ..
Unknown Text
Я вижу, что preg_replace ( предыдущее место ) принимает 3 параметра, регулярное выражение, тот самый заменяющий текст, и субъект.
Есть ли способ передать значение неизвестного текста параметру replacement text ИЛИ способ повторно использовать левую и правую части (НЕКОТОРЫЙ ИЗВЕСТНЫЙ ТЕКСТ) и (КАКОЙ-НИБУДЬ ДРУГОЙ ИЗВЕСТНЫЙ ТЕКСТ) не удаляя Неизвестный текст?В качестве альтернативы, существует ли str_replace() решение этой проблемы?
Спасибо
---ОБНОВЛЕНИЕ---
Фрагмент (КАКОЙ-ЛИБО ДРУГОЙ ИЗВЕСТНЫЙ ТЕКСТ) может существовать в других местах текста, но я не хочу, чтобы он удалялся, если он не соответствует шаблону (НЕКОТОРЫЙ ИЗВЕСТНЫЙ ТЕКСТ) Неизвестный текст (НЕКОТОРЫЙ ДРУГОЙ ИЗВЕСТНЫЙ ТЕКСТ).Я думаю, что первоначальные предложения str_replace не сработали бы из-за этого.
Решение
Каковы эти условия?Если у вас есть:
(КАКОЙ-ТО ДРУГОЙ ИЗВЕСТНЫЙ ТЕКСТ) Неизвестный текст (КАКОЙ-ТО ИЗВЕСТНЫЙ ТЕКСТ)
(т.е.если текст, заключенный в квадратные скобки, заменен), вы все еще хотите удалить его?Должен ли известный текст всегда находиться в начале или конце строки?Если ответ "да" на любой из этих вопросов, вам, вероятно, лучше использовать регулярное выражение.Что - то вроде этого:
$new_text = preg_replace('/^\(SOME KNOWN TEXT\)(.+)\(SOME OTHER KNOWN TEXT\)$/m, '$1', $text);
Обратная косая черта (\
) заключаются в том , чтобы избежать (
и )
символы, которые имеют особое значение в регулярных выражениях.Я предполагаю, что вы захотите изменить содержимое - на этом этапе вы можете удалить их.
В этом регулярном выражении .
является специальным оператором, означающим "любой символ". Он будет соответствовать любому символу.Тот Самый +
означает "один или несколько" и является модификатором предыдущего оператора - вместе они могут быть интерпретированы как соответствующие "одному или нескольким любым символам".Тот Самый (
и )
символы используются для захвата фрагментов текста в подшаблон.Охватывая .+
в круглых скобках мы фиксируем это для использования при замене.Первая секция, окруженная (
и )
помечены $1
с помощью движка регулярных выражений.Если бы у нас было больше, они были бы помечены $2
, $3
, и так далее.
Если ни то, ни другое не применимо, вы можете использовать str_replace
функционируйте, как упоминалось в других ответах.
Другие советы
Вы можете просто предоставить str_replace массив строк, которые вы хотите удалить, как таковые:
$destString = str_replace(array('TEXT A', 'TEXT B'), '', $sourceString);
Если вам не требуется какое-либо умное сопоставление с образцом, это будет более быстрое решение, чем регулярное выражение.
Если оба текста действительно известны, вы можете сделать это:
$result = str_replace(array('(SOME KNOWN TEXT)', '(SOME OTHER KNOWN TEXT)'), '', '(SOME KNOWN TEXT)Unknown Text(SOME OTHER KNOWN TEXT)');
что обеспечивает лучшую производительность, чем регулярное выражение.Первый аргумент — это набор ключей для замены, второй аргумент — на что его заменить, а третий — тема.