2011-03-05 7 views
0

各フィールドがタブで区切られている最初のフィールドを除いて、次のフォームの文字列を変更しようとしています。preg_replaceの置換配列内の特別な(エスケープされた)文字がエスケープされる

変更された文字列には、HTMLテーブルタグで囲まれた各フィールドがあり、それ自体でインデントされた行になります。

"<tr> 
    <td class="title">$str1</td> 
    <td sorttable_customkey="$str2"></td> 
    <td sorttable_customkey="$str3"></td> 
    <td sorttable_customkey="$str4"></td> 
    <td sorttable_customkey="$str5"></td> 
    <td sorttable_customkey="$str6"></td> 
</tr> 

" 

次のようなコードを使用してみました。

$patterns = array(); 
$patterns[0]='/^/'; 
$patterns[1]='/\t\t+/'; 
$patterns[2]='/\t/'; 
$patterns[3]='/$/'; 

$replacements = array(); 
$replacements[0]='\t\t<tr>\r\n\t\t\t<td class="title">'; 
$replacements[1]='</td>\r\n\t\t\t<td sorttable_customkey="'; 
$replacements[2]='"></td>\r\n\t\t\t<td sorttable_customkey="'; 
$replacements[3]='"></td>\r\n\t\t</tr>\r\n'; 

for ($i=0; $i<count($lines); $i++) { 
    $lines[$i] = preg_replace($patterns, $replacements, $lines[$i]); 
} 

問題は、交換配列のエスケープ文字(タブ、改行)はコピー先の文字列にエスケープしたままであることであり、私は次の文字列を取得します。

"\t\t<tr>\r\n\t\t\t<td class="title">$str</td>\r\n\t\t\t<td sorttable_customkey="$str2"></td>\r\n\t\t\t<td sorttable_customkey="$str3"></td>\r\n\t\t\t<td sorttable_customkey="$str4"></td>\r\n\t\t\t<td sorttable_customkey="$str5"></td>\r\n\t\t\t<td sorttable_customkey="$str6"></td>\r\n\t\t</tr>\r\n" 

は不思議なことに、私はに早く試してみました。このラインは仕事ん:私は何かを

$data=preg_replace("/\t+/", "\t", $data); 

足りませんか?どのようにそれを修正するための任意のアイデア?

+0

(はい、私は私が持っていることを知っていますそれらが重なっているため少し弦を微調整してください。) – Synetech

答えて

1

置換文字列のために二重引用符またはheredocが必要です - PCREは検索文字列内のエスケープ文字のみを解析します。

実際の例では、preg_replace("/\t+/", "\t", $data)は二重引用符で囲まれているため、両方ともリテラルタブ文字です。

preg_replace('/\t+/', '\t', $data)に変更した場合、PCREは検索文字列内の\tがタブを表していますが、置換文字列の文字列ではないことを理解しています。

だから、置き換えには二重引用符を使用します。​​の場合、PHPは\tを解析し、期待される結果を得ます。

ちょっと違和感があり、覚えておくだけです。

+0

ありがとうございました。 (実際には、私はいつも二重引用符を使用しています。私が一重引用符を使用した唯一の理由は、文字列の二重引用符を逃しても構わないということでした)。 – Synetech

1

$replacementsアレイのすべての文字列は、一重引用符で囲まれた文字列としてデカールされています。 これは、エスケープされた文字が(\'を除いて)スカイプしないことを意味します。

これはPCREの正規表現に直接関連するものではなく、PHPが文字列をどのように処理するかに関連しています。

基本的には、これらのような文字列を入力することができます。

<?php # String test 

$value = "substitution"; 
$str1 = 'this is a $value that does not get substituted'; 
$str2 = "this is a $value that does not remember the variable"; # this is a substitution that does not remember the variable 
$str3 = "you can also type \$value = $value" # you can also type $value = substitution 
$bigstr =<<< MARKER 
you can type 
very long stuff here 
provided you end it with the single 
value MARKER you had put earlier in the beginning of a line 
just like this: 
MARKER; 

TLを、DRバージョンを:問題は、二重引用符でなければなりません$replacements$patternsで単一引用符をある

関連する問題