アプリ版:「スタンプのみでお礼する」機能のリリースについて

<?
$text ="u&ampampfayv&ampin&ampe6&rna6uinv";
/////////////////////////////
print $text."<br>";
print "<XMP>".$text."</XMP><br>";
///////////////////////////////正規表現で置換
$text = preg_replace('/&[^amp]/', "■", $text);
//////////////////////////////
print $text."<br>";
print "<XMP>".$text."</XMP><br>";
//////////////////////////////
print "u&ampampfayv&ampin&ampe6■rna6uinv";
print "<XMP>u&ampampfayv&ampin&ampe6■rna6uinv</XMP>";
?>
$textの文字列の中にある & を ■ に変えたいです。
amp という文字列の前についている & は ■ に置換してはいけません。
&ampamp という文字列の前についている & も ■ に置換してはいけません。

現在の正規表現では r が消えてしまっています。
ブラウザで見た場合に結果が u&ampfayv&in&e6■rna6uinv になるようにして下さい。

よろしくお願いします。

A 回答 (4件)

否定的 先読み 正規表現 などのキーワードでGoogleなどで検索すると、サンプルが出てくると思います。

(例えば、参考URLのページ。)

参考URL:http://www4.ocn.ne.jp/~kaerume/k2e/regex_3.html
    • good
    • 0

$text = preg_replace("/&(?!amp)/","■",$text);



結果
u&ampampfayv&ampin&ampe6■rna6uinv

&ampampを&ampにしていませんので指定する結果とは異なります。

どんなことしてるかわかりませんが&ampampを見る限り
エンコードの順序等を見直したほうがいいんじゃないでしょうか
    • good
    • 0

いまいち状況がわかりませんが、こんなことなんでしょうか?



<?PHP
$text ="u&ampampfayv&ampin&ampe6&rna6uinv";
print $text."<br>";
$text = preg_replace(Array('/&([^amp])/','/&amp/'), Array('■$1','&'), $text);
print $text."<br>";
?>
    • good
    • 0

正規表現の解説書を読み直したほうがよろしいかと。


[] の中にあるのは文字列として扱われることはありませんから、
&[^amp]
とかいても、& のあとに amp が続かないものという意味にはなりません。

#2の方の回答にあるように、否定先読みを使うべきでしょう。
使わないでも書けますけど面倒ですから。

ところで
> u&ampampfayv&ampin&ampe6&rna6uinv

&amp; とセミコロンがちゃんとついていないとアンパサンドには
ならないような気がしますけどそれはよいのでしょうか?
一部には余計な気を回してくれるブラウザはあるかもしれませんが、
Firefoxではだめでしたよ。
    • good
    • 0

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