2015-11-19 6 views
0

Я не уверен, правильно ли задать вопрос дважды. Я уже задал следующий вопрос, и я нашел отличное решение. К сожалению, я нашел комбинацию, которая не работает с этим решением. Я много пытался изменить решение, но я не работал. Я также добавил комментарий, но, похоже, никто не замечает этот комментарий, поэтому я должен снова задать свой вопрос:php preg_replace regex заменить символ между двумя символами строки

Я хочу заменить символ в строке, но только если этот символ находится между двумя другими символами. В моем случае я хочу заменить все; которые заключаются между кавычками. Therefor я получил некоторые примеры строк:

asbas; "ASD;"; ASD; asdadasd; "ASD; adsas"

asbas "; ASD:; а" сд; asdadasd; "ASD: adsas; Taras; Адасс

"asbas"; "" ASD:; A "SD"; "asdadasd"; "" ASD: adsas ";" Тарас "" Адасс»

В мой последний вопрос (Question) Я получил следующее решение:

preg_replace ("/(\"[^\";]*);([^\"]*\")/m", "\\1:\\2", 
        'asbas;"asd;";asd;asdadasd;"asd;adsas"'); 

Это решение работает отлично, но только в этом случае, когда наличие двойных объектов является eval. Итак, первая строка-строка отлично работает, но не вторая или третья.

Я также попробовал:

preg_replace_callback('/"[^"]+"/', 
    function ($m) { return str_replace(";", ":", $m[0]); }, 
    $str); 

Для clearify мой вопрос: мне нужно регулярное выражение, которое работает с обоих примерных строк и дают следующие результаты:

asbas; "ASD:" ; ASD; asdadasd; "ASD: adsas"

asbas; "ASD ::" сд; asdadasd; "ASD: adsas; тарас; Адасс

"asbas"; "" ASD :: "с.о."; "asdadasd"; "" ASD: adsas ";" Taras ";" Адасс»

ЗАМЕНИТЬ должен иметь место только, когда точка с запятой между двойными кавычками.

Благодарю вас за помощь и ответы.

Сердечные приветы

Маркус

EDIT: Фоновый моего вопроса является предварительной подготовки CSV-файлов. Есть некоторая комбинация, в которой даже excel не знает, как обрабатывать файл «правильно» ... поэтому я пытаюсь изменить какой-то символ и интерпретировать его, поскольку я знаю, что файл должен быть ... так что столбец - это один блок " ... "и разделяется точкой с запятой. И знаю, что я хочу изменить точку с запятой als между блоком двойных кавычек ... проблема возникает, если есть и «-характер в блоке с двумя кавычками. Поэтому мне нужно регулярное выражение, которое даже находит точку с запятой в этом блоке.

ответ

0

Вы можете использовать комбинации preg_replace_callback() и str_replace().Рассмотрим следующий код и пояснения:

<?php 
$str = '"asbas";""asd::a"sd";"asdadasd";""asd:adsas";"taras";"adass"'; 
echo "$str\n";   // prints out the string 
$regex = '/([^"]+)/i'; 
// captures every character EXLUDING a double quote 
// case-insensitive, must be more/equal to 1 character 

$str = preg_replace_callback($regex, 
    function($matches) { 
     return str_replace(';', '', $matches[0]); 
     // replaces every semicolon with '' in the captured group 
    }, 
     $str 
    ); 

echo "$str\n"; 
// output: "asbas"""asd::a"sd""asdadasd"""asd:adsas""taras""adass" 
?> 
+0

Эй, ян. Спасибо за ваш ответ. К несчастью, это не проблема. Ваше решение удаляет каждый; и я хочу только удалить; между двойными кавычками ... Возможно, вы можете сравнить мои ожидаемые результаты. –

Смежные вопросы