2015-11-19 56 views
0

我不確定提問兩次是否正確。我已經問過以下問題,我找到了一個很好的解決方案。不幸的是,我發現了一種不適用於此解決方案的組合。我嘗試了很多修改解決方案,但我沒有工作。我還添加了一條評論,但似乎沒有人評論這條評論,爲什麼我不得不再次提出我的問題:php preg_replace正則表達式替換字符串中兩個字符之間的字符

我想替換字符串中的字符,但前提是此字符在兩個其他字符之間。在我的情況下,我想要取代所有;介於雙引號之間。 爲此我得到了一些例子字符串:

asbas; 「ASD;」; ASD; asdadasd; 「ASD; adsas」

asbas; 「ASD:;一」 SD; asdadasd;「ASD: adsas;塔拉斯;阿達斯

「asbas」; 「」 ASD:;一個 「SD」, 「asdadasd」; 「」 ASD:adsas 「;」 塔拉斯 「;」 阿達斯」

在我的最後一個問題(Question)我得到了以下解決方案:

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

這個解決方案很好用,但只有在這種情況下doublequot的出現是eval。所以第一個例子字符串很好,但不是第二個或第三個。

我也試過了:

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

要clearify我的問題:我需要用兩個例子字符串工作,並給出如下結果的正則表達式:

asbas; 「ASD」 ; ASD; asdadasd; 「ASD:adsas」

asbas; 「ASD ::一個」 SD; asdadasd;「ASD:adsas;塔拉斯;阿達斯

「asbas」; 「」 ASD ::一個 「SD」, 「asdadasd」; 「」 ASD:adsas 「;」 塔拉斯 「;」 阿達斯」

的更換時,分號是隻應在雙引號之間。

非常感謝您的幫助和解答。

親切的問候

馬庫斯

編輯: 我的問題的背景是CSV-文件前的準備。這是一些組合,即使excel不知道如何處理文件「正確」...所以我嘗試改變一些字符並解釋它,因爲我知道文件應該是...所以該列是一塊「 ...「並用分號分隔。並且知道我想在雙引號之間更改als分號塊...如果在雙引號塊中還有一個「-character」,那麼我需要正則表達式,它甚至可以在此塊中找到分號

回答

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

嘿,感謝您的答覆。不幸的是,這並不能解決我的問題。您的解決方案刪除每個我只想刪除;之間的雙引號......也許你可以比較我的預期結果。 –