Для собственного скриптового скрипта в PHP я хотел бы заменить несколько слов в многострочной строке, содержащей двойные и одинарные кавычки. Однако только текст, находящийся вне кавычек, может быть заменен.
Many apples are falling from the trees. "There's another apple over there!" 'Seedling apples are an example of "extreme heterozygotes".'
Например, я хотел бы заменить «яблоко» на «грушу», но только вне предложений цитаты. Таким образом, в этом случае только «яблоко» внутри «Многие яблоки падают с деревьев» будет нацелено.
Вышеизложенное даст следующий результат:
Many pears are falling from the trees. "There's another apple over there!" 'Seedling apples are an example of "extreme heterozygotes".'
Как я могу это достичь?
Эта функция выполняет трюк:
function str_replace_outside_quotes($replace,$with,$string){ $result = ""; $outside = preg_split('/("[^"]*"|\'[^\']*\')/',$string,-1,PREG_SPLIT_DELIM_CAPTURE); while ($outside) $result .= str_replace($replace,$with,array_shift($outside)).array_shift($outside); return $result; }
Как это работает. Он разбивается на строки с кавычками, но включает в себя эти цитированные строки, это дает вам чередующиеся строки без кавычек, кавычек, не кавычек, цитаты и т. Д. В массиве (некоторые из некомандных строк могут быть пустыми). Затем он чередуется с заменой слова и не заменяет, поэтому заменяются только не кавычные строки.
С вашим примером
$text = "Many apples are falling from the trees. \"There's another apple over there!\" 'Seedling apples are an example of \"extreme heterozygotes\".'"; $replace = "apples"; $with = "pears"; echo str_replace_outside_quotes($replace,$with,$text);
Вывод
Many pears are falling from the trees. "There's another apple over there!" 'Seedling apples are an example of "extreme heterozygotes".'
Я придумал это:
function replaceOutsideDoubleQuotes($search, $replace, $string) { $out = ''; $a = explode('"', $string); for ($i = 0; $i < count($a); $i++) { if ($i % 2) $out .= $a[$i] . '"'; else $out .= str_replace($search, $replace, $a[$i]) . '"'; } return substr($out, 0, -1); }
Логика такова: вы взорвали строку двойными кавычками, поэтому нечетные элементы возвращаемого строкового массива представляют текст вне кавычек, и даже одни представляют текст внутри двойных кавычек.
Таким образом, вы можете построить свой вывод, объединив оригинальные детали и заменяемые части в качестве альтернативы, хорошо?
Рабочий пример здесь: http://codepad.org/rsjvCE8s
Просто подумайте: создайте временную строку, удалив процитированные части, замените то, что вам нужно, затем добавьте удаленные цитаты.
Вы можете использовать preg_replace, используя регулярное выражение, чтобы заменить слова внутри ""
$search = array('/(?!".*)apple(?=.*")/i'); $replace = array('pear'); $string = '"There\'s another apple over there!" Seedling apples are an example of "extreme heterozygotes".'; $string = preg_replace($search, $replace, $string);
Вы можете добавить более доступные объекты для поиска, добавив еще один RegEx в $ search, а другую замените строку в $ replace
Этот RegEx использует lookahead и lookbehind, чтобы выяснить, находится ли искомая строка внутри ""