検索
ホームページphp教程php手册PHP プログラミング: 文字列の謎を探る

编程

  在许多Web编程里,字符串总是会被大量地生成和处理的。正确地使用和处理字符串,对于PHP程 序员来说也同样越来越重要了。本文从最简单的字符串定义一直引导你到高层字符串处理技巧,希望 对大家有所帮助。

  
一、引号定义字符串

  在PHP中,通常一个字符串被定义在一对引号中,如:

  'I am a string in single quotes'
"I am a string in double quotes"

  PHP语法分析器是用成对的引号来判断一个字符串的。因此,所有字符串必须使用同一种单或者双 引号来定义开始和结束。例如,下面的字串定义是不合法的:

  "I am not a valid string since I have unmatching quote marks'
'Me neither!"

  定义字符串时,只有一种引号被视为定义符,即单引号或双引号。于是,如果一个字符串由双引号开始,那么只有双引号被分析器解析。这样,你就可以在双引号串中包含任何其他字符,甚至单引号。下面的引号串都是合法的:

  $s = "I am a 'single quote string' inside a double quote string";
$s = 'I am a "double quote string" inside a single quote string';

  当PHP遇到与串的开头相对应的引号时,便认为已经到了字符串尾部,于是:

  "Why doesn't "this" work?"

  实际上被PHP语法分析器分成三个部分:

  "Why doesn't "——包含一个单引号的双引号串
this——多余的字符,分析器无法处理" work?" ——普通字符串

  上面的这个例子企图在双引号串中包含双引号,而分析器在遇到第二个双引号时便认为字符串结束了。要达到包含引号的目的, 必须分析器在遇到串内普通引号的时候忽略它的原意,我们在引号的前面加上一个反斜杠来告诉PHP:这个引号是字符串的一部分,正确的表示方法是这样:

"Why doesn't \"that\" work?"

  在英文字符串中一个常见的问题是撇号'的使用,因为它就是一个单引号,而在英文串中十分常见 (英文所有格)。你必须小心处理这些字符:

  'You\'d better escape your apostrophes'

  可以看到反斜杠在字符串中有他的特殊含义,当我们需要在字符串中包含反斜杠本身时,需要在
该符号前面多加一个反斜杠。例如:

  $file = "c:\windows\system.ini";
  echo $file; // 打印结果为: c:windowssystem.ini
  $file = "c:\\windows\\system.ini";
  echo $file; // 打印结果为: c:\windows\system.ini

  另一种字符串定义方式,能够消除特殊字符的烦恼,而且便于引用较长的文本。该字符串定义方法以


  二、字串的连接

  字串可以使用字串连接符(.)来连接,如:

  $first_name = 'Charlie';
$last_name = 'Brown';
$full_name = $first_name . ' ' . $last_name;

  常见的用途是建立大块的HTML字串代码,赋值号 (=) 连接符 (.) 可以被简写合并为 (.=) 符号,如:

$html = '

';
$html .= '';
for ( $i=0 ; $i  $square = $i * $i;
  $html .= '';
  }
$html .= '
number square
' . $i . ' ' . $square . '
';


  三、在字串中使用变量

  这个功能让你无须使用连接符号来粘和大量的简单字符串。PHP允许我们在双引号串中直接包含字 串变量,我们可以发现下面的两个字串的处理结果是相同的。

  $full_name = $first_name . ' ' . $last_name;
$full_name = "$first_name $last_name";

  单引号串和双引号串在PHP中的处理是不相同的。双引号串中的内容可以被解释而且替换,而单引 号串中的内容总被认为是普通字符。例如:

$foo = 2;
echo "foo is $foo"; // 打印结果: foo is 2
echo 'foo is $foo'; // 打印结果: foo is $foo
echo "foo is $foo\n"; // 打印结果: foo is 2 (同时换行)
echo 'foo is $foo\n'; // 打印结果: foo is $foo\n

ご覧のとおり、一重引用符文字列内のバックスラッシュでさえ、その拡張された意味を失います (バックスラッシュ \ の挿入と一重引用符 ' の挿入を除く)。したがって、変数置換を実行し、文字列に n (改行) などのエスケープ シーケンスを含める場合は、二重引用符を使用する必要があります。一重引用符文字列は他のどこでも使用できます。スクリプト内で一重引用符文字列を使用すると、処理速度が速くなります。これは、PHP パーサーが一重引用符文字列を比較的単純な方法で処理する一方で、二重引用符の処理も内部で解析する必要があるためです。したがって、文字列はより複雑になり、処理が若干遅くなります。

文字列内の変数の複雑な組み合わせを参照する場合、いくつかの問題が発生する可能性があります。

echo "value = $foo";
echo "value = $a[ $i]";

しかし、次のコードでは望む結果を得ることができません:

echo "value = $a[$i][$j]"; / /出力したい2 次元配列 $a の要素。

文字列を使用する際のこれらの潜在的な問題を回避するには、通常、次のように複雑な変数を文字列から分離します。

echo 'value = '

もう 1 つの方法は、複雑な変数を中括弧で囲んで、パーサーがそれらを正しく識別できるようにすることです。

echo "value = { $a [$i][$j]}" //二次元配列 $a の要素を出力する

このようにして、新たな問題が発生します。文字列内で中括弧文字自体を引用したい場合は、エスケープ文字を忘れずに使用する必要があります。

$var = 3; print Result "value = 3"
Echo "value = { $var}"; // print result "value = { 3}"

3. スラッシュと SQL ステートメント

HTML コードまたは SQL クエリ ステートメントの生成は、PHP プログラムを作成するときによく発生するものであり、興味深いことです。なぜそう言えるのでしょうか? これには別のタイプのコードの生成が含まれるため、このタイプのコードに必要な記述構文とルールを慎重に検討し、従う必要があります。

例を見てみましょう。データベース内の名前が「O'Keefe」であるユーザーをクエリする場合、通常の SQL ステートメントは次の形式になります。

select * from users where last_name = 'O'Keefe'

SQL ステートメントの英語の所有文字 (アポストロフィ) はバックスラッシュでエスケープする必要があることに注意してください。 PHP は、このような状況に対処するための関数を特に提供しています。AddSlashes($str) 関数の目的は、文字列内の引用符文字にバックスラッシュ エスケープ文字を自動的に挿入することです。

$sql = "select * from users where last_name = '" .addslashes($last_name) . "'";

この例では、last_name 文字列も一重引用符で囲む必要があります (SQL 構文)ここでは二重引用符文字列が使用されているため、一重引用符のペアをエスケープする必要はありません。次のステートメントは、単一引用符文字列を使用するのと同じです:

$sql = 'select * from users where last_name = '' .addslashes($last_name) '';データベースに文字列を書き込むときは、内部の引用符が適切にエスケープされていることを確認する必要があります。これは、多くの PHP 初心者が犯すよくある間違いです。

4. 二重引用符と HTML

SQL ステートメントとは異なり、標準 HTML 言語では二重引用符は文字列を表すためによく使用されます (多くのブラウザーには強力なフォールト トレランス機能が備わっており、文字列をHTML では一重引用符で表すことも、引用符なしで表すこともできます)。例:

$html = ''.$link.' a>';
$html = "
$link";

HTML言語はバックスラッシュエスケープをサポートしていません。フォームの非表示の入力を使用してデータを送信します。非表示の入力の値を設定する最良の方法は、htmlspecialchars() 関数を使用してエンコードすることです。通常、次のステートメントは二重引用符を含む可能性のあるデータを送信できます:


声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境