dポイントプレゼントキャンペーン実施中!

以下のプログラムの中に
$mt = preg_match("/". $valueptr . "/", $valuestr)
がありまが、. $valueptr . の$valueptrが..(ドット)の文字列連結演算子
でなぜ文字をつなげる必要があるのでしょうか?
foreach($ptr as $valueptr){で指定しているので、表の行には
必要に応じて文字列が順番に表示されると思います。
なので必要性ないような気がします!?
宜しくお願いします。


<!DOCTYPE html>
<html>
<head>
<title>^ $ で文字検索(行頭・行末)</title>
</head>
<body>

<?php

$ptr = array("ABC", "^ABC", "ABC$", "^ABC$");
$str = array("ABC", "ABCC", "ABCCC","AABC");

?>

<table border="2">
<tr bgcolor="#AAAAAA">
<th>パターン</th>
<th>文字列</th>
<th>マッチ</th>
</tr>

<?php

foreach($ptr as $valueptr){
foreach($str as $valuestr){

print "<tr><td>{$valueptr}</td><td>{$valuestr}</td>";

$mt = preg_match("/". $valueptr . "/", $valuestr)
? "〇": "×";
print "<td>{$mt}</td></tr>\n";

}
}

?>

</table>

</body>
</html>

質問者からの補足コメント

  • うれしい

    皆様ご回答くださいましてありがとうございます。
    手が空き次第調べたいと思います。
    しばらくお待ちください。

      補足日時:2018/04/01 07:50

A 回答 (3件)

> 間違いでしょうか?



間違いです。



foreach($ptr as $valueptr){
 foreach($str as $valuestr){
  (中略)
 }
}
の意味をご理解いただいているのでしょうか?



$ptrと$strは要素を4個ずつ持っているので
 $mt = preg_match("/". $valueptr . "/", $valuestr) ? "〇": "×";
は各々値を変えて、4×4の計16回実行されて表示されます。


即ち以下の通りです。

$valueptrの値 $valuestrの値 preg_match("/". $valueptr . "/", $valuestr)

"ABC"     "ABC"     preg_match("/ABC/", "ABC")
"ABC"     "ABCC"     preg_match("/ABC/", "ABCC")
"ABC"     "ABCCC"    preg_match("/ABC/", "ABCCC")
"ABC"     "AABC"     preg_match("/ABC/", "AABC")

"^ABC"     "ABC"     preg_match("/^ABC/", "ABC")
"^ABC"     "ABCC"    preg_match("/^ABC/", "ABCC")
"^ABC"     "ABCCC"    preg_match("/^ABC/", "ABCCC")
"^ABC"     "AABC"    preg_match("/^ABC/", "AABC")

"ABC$"     "ABC"     preg_match("/ABC$/", "ABC")
"ABC$"     "ABCC"    preg_match("/ABC$/", "ABCC")
"ABC$"     "ABCCC"    preg_match("/ABC$/", "ABCCC")
"ABC$"     "AABC"    preg_match("/ABC$/", "AABC")

"^ABC$"     "ABC"    preg_match("/^ABC$/", "ABC")
"^ABC$"     "ABCC"    preg_match("/^ABC$/", "ABCC")
"^ABC$"     "ABCCC"   preg_match("/^ABC$/", "ABCCC")
"^ABC$"     "AABC"    preg_match("/^ABC$/", "AABC")


文字の連結云々は、あくまでも$valueptrの両側に"/"をくっつけているだけです。
    • good
    • 2
この回答へのお礼

再度、又お分かりやすいご回答をくださいましてありがとうございました。
>$ptrと$strは要素を4個ずつ持っている<
了解です。
 ("/". $valueptr . "/", $valuestr) は
>各々値を変えて、4×4の計16回実行されて表示<
..(ドット)役割ですが!アナログ的な表現をした場合、背景では沢山の一連の
仕事をやっていることがご回答でよくわかりました^^
まだ完ぺきではないのですが、徐々に理解を深めた行きたいと思います。
 助かりました。
 今後ともよろしくお願いいたします。

お礼日時:2018/04/02 06:46

>仮に


>1)$ptr = array("ABC", "^ABC", "ABC$", "^ABC$");の文字列をつなげた場合ですが
>         ABC^ABCABC$^ABC$ となっる。

文字列連結演算子でつなげるのは、$valueptr  であって $ptr ではありませんよ
foreach($ptr as $valueptr){
ですから、$valueptr は $ptr の一要素、たとえば "ABC" や  "^ABC"
になるので、連結したあとの
 "/". $valueptr . "/" 
は、それぞれ "/ABC/" や  "/^ABC/" になります。
両側を/で囲んだ文字列にして、めでたく preg_match を呼び出しているということです。
    • good
    • 2
この回答へのお礼

ご回答くださいましてありがとうございました。
>文字列連結演算子でつなげるのは、$valueptr  であって $ptr ではありません<
了解です。
("ABC", "^ABC", "ABC$", "^ABC$");をarrayで配列しているですね!

>$valueptr は $ptr の一要素、たとえば "ABC" や  "^ABC"<
になるので、連結したあとの"/". $valueptr . "/" 
は、それぞれ "/ABC/" や  "/^ABC/" になります。<
了解です。
siffon9様のご回答に詳しくありましたので
それを参考に今から学習を進めていきたいと思います。
 今後ともよろしくお願いいたします。

お礼日時:2018/04/02 04:43

preg_matchはperl互換正規表現と呼ばれていますが、


preg_match(文字列1,文字列2)と記述するとき、文字列1は必ず//で囲むことが慣例になっています。
提示例の1回目の文字列の比較は、"ABC"と"ABC"なので
preg_match("/ABC/","ABC")のようになります。
その為、(ドット)の文字列連結演算子で文字列をつなげています。
下記URLを参照ください。
http://php-web.net/regular/preg.html
    • good
    • 2
この回答へのお礼

ご回答くださいましてありがとうございます。
>1回目の文字列の比較は、<
>preg_match("/ABC/","ABC")のようになります。<
この意味は分かりました。

>その為、(ドット)の文字列連結演算子で文字列をつなげています。<
の>文字列をつなげています。< ここですが!
意味がいまいちわかりません?

それで質問です。
"/". $valueptr . "/" ?ですが! 
この場合、文字列連結演算子で
何処の文字列をつなげているかで、二つに一つと思います。

仮に
1)$ptr = array("ABC", "^ABC", "ABC$", "^ABC$");の文字列をつなげた場合ですが
         ABC^ABCABC$^ABC$ となっる。

2)$str = array("ABC", "ABCC", "ABCCC","AABC");の文字列をつなげた場合
        ABCABCCABCCCAABC となる。
以上ですが、私的には以上のしか想像がつきません。
間違いでしょうか?
 宜しくお願いします。

お礼日時:2018/04/01 06:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!