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

<やりたいこと>
<span class="blue">データ</span>
<br>

の<br>タグを削除したいです。

<試したけどううまくいかなかった内容>
$match = "/(<span class=\"blue;\">(.*?)<\/span>)(.*?)<br>/ism";
$replace = "<span class=\"blue;\">$1</span>";
$code = preg_replace($match, $replace, $code);

A 回答 (2件)

blueの後にセミコロンなんてありませんけど。


あと、パターンがあるなら必要ですが、質問にある内容だけ
なら正規表現を使う必要ありませんね。

正規表現は/(?<=<\/span>)(.*?)<br>/isでもいいかもしれませんし。

【test.txt】
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>
<body>
<span class="blue">データ</span>
<br>
<span class="blue">データ</span>
<br>
<span class="blue">データ</span>
<br>
</body>
</html>


【a.php】
<?php
$code = file_get_contents("D:/PHP/test.txt");
echo "元\r\n";
echo $code;
echo "\r\n";
echo "先\r\n";
$match = "/(?<=<\/span>)(.*?)<br>/is";
$replace = "";
$result = preg_replace($match, $replace, $code);
echo $result;

【結果】
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>
<body>
<span class="blue">データ</span>
<br>
<span class="blue">データ</span>
<br>
<span class="blue">データ</span>
<br>
</body>
</html>

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>
<body>
<span class="blue">データ</span>
<span class="blue">データ</span>
<span class="blue">データ</span>
</body>
</html>

この回答への補足

回答&コードご提示いただき、ありがとうございます。

質問文に書いていなかったのですが、実は、下記のような状態で、他にもクラスがあり
その内、blueクラスの一行下にある<br>だけど削除したいのですが、
その場合は、どうしたら良いでしょうか?
<span class="★★">データ</span>
<br>
<span class="blue">データ</span>
<br>

後、回答いただいた内容で、「 ?<= 」部分の意味が分からないのですが、
これは、どのような意味なのでしょうか?

補足日時:2012/11/22 12:54
    • good
    • 0

それなら元々作成されていたものがほぼ正解に近いです。


(当然ながら、spanの属性の書き順などには依存しますが)

主な誤りは、セミコロン、$1とするパターン範囲です。

まず、パターンからclass属性内のセミコロンを外しましょう。

$1は、初めに優先、つまり「(」が現れたグループを対象とするので、
今回の質問内容だと、<span class=\"blue;\">(.*?)<\/span>で
マッチした部分になってしまいます。

<span>~</span>の中身を欲しいわけですから、$2とすれば良いです。
また、今回の場合だと、<span>~</span>は全て必要なわけですから、
(<span class=\"blue;\">.*?<\/span>)
とした上で、置換文字は$1とすれば良いです。


(?<=)は肯定戻り読みです。
(?<=)で指定した文字列がマッチする次の文字から、残りのパターンを調べ、
マッチする文字列を取り出します。
肯定戻り読みで指定した部分は取り出し対象になりません。
肯定戻り読みの中では可変文字長の指定はできません。.*とか.{3,}とか。
    • good
    • 0
この回答へのお礼

回答&詳細な解説ありがとうございます。
おかげでうまくいきました!

> (?<=)は肯定戻り読みです
初めて聞きました。これから色々試してみたいと思います。

色々勉強になりましたー

お礼日時:2012/11/22 23:34

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