0

文字列に二重の円記号'\'があり、単一の円記号'\'に変換する必要があります。いくつかの組み合わせを試しましたが、エコーを使用したり、誤って文字列にバックスラッシュを追加したりすると、文字列全体が消えてしまいました。この正規表現は、私をばかげたものにさせています...笑...

私は他の失敗した試みの中でこれを試しました:

$pattern = '[\\]';
$replacement = '/\/';

?>
<td width="100%">&nbsp;<?php echo preg_replace($pattern, $replacement,$q[$i]);?></td>

これが愚かな問題である場合はお詫び申し上げます。ご意見をいただければ幸いです。

4

6 に答える 6

7

使用stripslashes()-それはあなたが探しているものを正確に行います。

<td width="100%">&nbsp;<?php echo stripslashes($q[$i]);?></td>
于 2012-10-19T20:21:10.387 に答える
2

代わりにストリップスラッシュを使用してください。また、正規表現で単一の円記号を検索していて、置換が正しくありません。私はこれをテストしていませんが、\\{2}ダブルバックスラッシュを検索し、それらをシングルに置き換える必要があります。\

さらに説明すると、このパターン[\\]は、単一の円記号で構成されるセット内の任意の文字と一致します。PHPでは、正規表現をスラッシュで区切る必要もあります。/[\\]/

(区切り文字なしの)置換は\、単一の円記号を照合するための正規表現ではありません。単一の円記号を一致させるための正規表現はです\\。エスケープに注意してください。とはいえ、置換用語は正規表現ではなく文字列である必要があります(後方参照を除く)。

編集:以下のSvenは、stripslashesがすべてのバックスラッシュを削除すると主張しています。これは単に真実ではありません。その理由を以下で説明します。

文字列に2つの円記号が含まれている場合、最初の円記号はエスケープされた円記号と見なされ、削除されます。これはhttp://www.phpfiddle.org/main/code/3yn-2utで見ることができます。バックスラッシュがまったく残っているという事実は、ストリップスラッシュがすべてのバックスラッシュを削除するという主張と矛盾します。

明確にするために、この文字列宣言は無効です$x = "\";。バックスラッシュは2番目の引用符をエスケープするためです。この文字列には円記号が1つ"\\"含まれています。この文字列の引用符を外す過程で、この円記号は削除されます。この文字列には2つの円記号が含まれています。引用符を外すと、最初の円記号はエスケープされた円記号と見なされ、削除されます。"\\\\"

于 2012-10-19T20:22:38.340 に答える
2

preg_replaceを使用して、二重の円記号を単一の円記号に変換します。

preg_replace('/\\\\{2}/', '\\', $str)
  • CodeAngryが言うように、最初のパラメーターの\inは、2回エスケープする必要があります。stringregex
  • 2番目のパラメーターでは、。に対して1回だけexcapedされstringます。

わかる?

于 2014-11-09T01:55:32.970 に答える
1

「ダブルバックスラッシュのすべてのインスタンス」の場合のように、探している文字列が一定である場合は、正規表現を使用しないでください。

str_replace()このタスクに使用します。これは、文字列が出現するたびに別の文字列に置き換える非常に簡単な関数です。

あなたの場合:str_replace('\\\\', '\\', $var)

引用符(シングルまたはダブル)内では、シングルバックスラッシュが次の文字のエスケープシーケンスの開始であるため、ダブルバックスラッシュは実際には4つのバックスラッシュに変換されます。リテラルの円記号が1つ必要な場合は、そのうちの2つを記述する必要があります。2つの円記号が必要で、そのうちの4つを記述する必要があります。

私はの提案が好きではありませんstripslashes()。もちろん、これにより、二重の円記号が1つの円記号に「デコード」されます。ただし、文字列全体のすべての円記号も削除されます。何もなかった場合-問題ありません。そうでない場合、物事は今失敗します。

于 2012-10-21T19:15:30.743 に答える
0
$pattern = '[\\]'; // wrong
$pattern = '[\\\\]'; // right

\\]はエスケープされた]を意味するため、\を\\としてエスケープし、\\を\\\\としてエスケープします。

于 2012-10-19T20:24:06.453 に答える
-2

htmlentities関数を使用してスラッシュをhtmlエンティティに変換してから、str_replaceまたはpreg_matchを使用してスラッシュを新しいエンティティに変更します

于 2012-10-19T20:32:05.007 に答える