web-dev-qa-db-ja.com

単一引用符のみをエスケープするにはどうすればよいですか?

PHPでレンダリングされた文字列を使用するJavaScriptコードを書いています。 PHP文字列で単一引用符(および単一引用符のみ)をエスケープするにはどうすればよいですか?

<script type="text/javascript">
    $('#myElement').html('say hello to <?php echo $mystringWithSingleQuotes ?>');
</script>
64
Andrew

簡単に言うと、echo str_replace('\'', '\\\'', $myString);ただし、より信頼性の高い JSON および json_encode() 関数の使用をお勧めします(たとえば、新しい行を引用します)。

<?php $data = array('myString' => '...'); ?>

<script>
   var phpData = <?php echo json_encode($data) ?>;
   alert(phpData.myString);
</script>
60
Crozin

\で文字をエスケープしたい場合、addcslashes()があります。たとえば、質問のように単一引用符のみをエスケープしたい場合は、次のようにします。

echo addcslashes($value, "'");

'"\、およびnul(バイトnull)をエスケープする場合は、addslashes()を使用できます。

echo addslashes($value);
19
PhoneixS
str_replace("'", "\'", $mystringWithSingleQuotes);
16
Julian

場合によっては、エンティティに変換するだけです:

                        // i.e.,  $x= ABC\DEFGH'IJKL
$x = str_ireplace("'",  "&apos;", $x);
$x = str_ireplace("\\", "&bsol;", $x);
$x = str_ireplace('"',  "&quot;", $x);

HTMLページでは、視覚的な出力は同じです。

ABC\DEFGH'IJKL

ただし、ソースはサニタイズされます。

10
T.Todua

単一引用符のみを置き換えるには、次の簡単なステートメントを使用します。

$string = str_replace("'", "\\'", $string);
8
DevelRoot

addcslashes 関数を使用して、次のように実行できます。

echo addcslashes($text, "'\\");
4
Junior

ネイティブ関数htmlspecialcharsを使用します。すべての特殊文字からエスケープします。引用から具体的にエスケープする場合は、ENT_COMPATまたはENT_QUOTESを使用します。以下に例を示します。

$str = "Jane & 'Tarzan'";
echo htmlspecialchars($str, ENT_COMPAT); // Will only convert double quotes
echo "<br>";

echo htmlspecialchars($str, ENT_QUOTES); // Converts double and single quotes
echo "<br>";

echo htmlspecialchars($str, ENT_NOQUOTES); // Does not convert any quotes

出力は次のようになります。

Jane &amp; 'Tarzan'<br>
Jane &amp; &#039;Tarzan&#039;<br>
Jane &amp; 'Tarzan'

詳細はPHP htmlspecialchars()関数

3
Nishad Up

この問題と長い間闘ってきた後、私はより良い解決策を見つけたと思います。

2つの関数を組み合わせると、文字列をエスケープしてHTMLとして使用できるようになります。

JavaScript関数呼び出し内で文字列を使用する場合は二重引用符をエスケープし、引数を囲む単純な引用符を避けるために単一引用符をエスケープします。

解決策:

mysql_real_escape_string(htmlspecialchars($string))

解決する:

  • 次のようなJavaScript関数を呼び出すために作成されたPHP行

echo 'onclick = "javascript_function(\' '。mysql_real_escape_string(htmlspecialchars($ string))"

1
arturocu81

次の関数を書きました。以下を置き換えます。

スラッシュと一重引用符[\ ']を含む一重引用符[']。

バックスラッシュ[\]と2つのバックスラッシュ[\\]

function escapePhpString($target) {
    $replacements = array(
            "'" => '\\\'',
            "\\" => '\\\\'
    );
    return strtr($target, $replacements);
}

これを変更して、$ replacements配列の文字置換を追加または削除できます。たとえば、\ r\nを置き換えると、「\ r\n」=>「\ r\n」および「\ n」=>「\ n」になります。

/**
 * With new line replacements too
 */
function escapePhpString($target) {
    $replacements = array(
            "'" => '\\\'',
            "\\" => '\\\\',
            "\r\n" => "\\r\\n",
            "\n" => "\\n"
    );
    return strtr($target, $replacements);
}

Strtrの素晴らしい機能は、長い置換を好むことです。

たとえば、「Cool\r\nFeature」は、\ nをエスケープするのではなく、\ r\nをエスケープします。

0
Basil Musa

これが私がやった方法です。愚かな、しかしシンプル。

$singlequote = "'";
$picturefile = getProductPicture($id);

echo showPicture('.$singlequote.$picturefile.$singlequote.');

JavaScriptコードを呼び出して画像を表示するHTMLの出力に取り組んでいた...

0

あなたがあなたのデータで何をしているのか正確にはわかりませんが、あなたはいつも試すことができます:

$string = str_replace("'", "%27", $string);

文字列が保存のためにデータベースに送信されるたびにこれを使用します。

%27は '文字のエンコードであり、サーバーに送信される文字列に単一の'文字が含まれている場合、GET要求の中断を防ぐのにも役立ちます。誰かが手動でPHP関数にデータを送信しようとする場合に備えて、JavaScriptとPHPの両方で 'を%27に置き換えます。

エンドユーザーにわかりやすくするには、サーバーから取得したすべてのデータに対して逆置換関数を実行し、すべての%27部分文字列を'に置き換えます。

ハッピーインジェクション回避!

0
Mike