人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPでの正規表現の質問です。
行頭(先頭もしくは<br />の直後)の「>」または「>」から行末(<br />)までをマッチさせ、「>」または「>」から行末の直前の文字までを<p>タグに入れる、という置き換えをしたいのですがどうすれば良いでしょうか。

要するに、HTML文書の引用部分の色を変える処理をしたいのです。

例えば、

>りんご<br />赤い<br /><br />>バナナ<br />黄色い

なら、

<p>>りんご</p>赤い<p>>バナナ</p>黄色い

としたいのです。

●質問者: wintarsnow
●カテゴリ:ウェブ制作
✍キーワード:HTML PHP りんご タグ バナナ
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● ke_ishi
●15ポイント

1. 最終的に<br />は不要なのであれば、先に改行に書き換える

$str = str_replace(’<br />’, ”¥n”, $str);


2. 行単位で分割し、配列に入れておく

$arr = explode(”¥n”, $str);


3. 各行に対して、置換をかける

foreach($arr as $key => $val){

$arr[$key] = mb_ereg_replace(’^([>>].+)$’, ’<p>¥1</p>’, $val);

}


4. 配列を連結する

$str = implode(’’, $arr);


とか

◎質問者からの返答

回答ありがとうございます。

なるほど。行毎に置き換える方法があるのですね。

やっぱり一度には出来ないでしょうか。

$str=mb_ereg_replace(”(((
)+(>|(>))+)|^(>|(>))+)([^(
)]+)
”,”

¥¥4¥¥5¥¥6¥¥8

”,$str);

自分ではこんな風にやってみたのですが、何故か置き換えられる場合とそうでない場合があって…。


2 ● izayoimizuki
●20ポイント

<?php

$re = ””;

$x = explode (”<br />”, ”>りんご<br />赤い<br />>バナナ<br />黄色い”);

for ($i = 0; $i < count($x); $i++) {

if (ereg (”^>.*”, $x[$i]) or ereg (”^>.*”, $x[$i])) {

$re = $re . ”<p>” . $x[$i] . ”</p>”;

} else {

$re = $re . $x[$i];

}

}

echo $re;

?>

こんな感じでよいでしょうか。

◎質問者からの返答

回答ありがとうございます。

こちらも行毎に処理する方法ですね。

うーん、正規表現置き換えで一度にすることは不可能なのでしょうか?

もし不可能なら行毎にします。


3 ● mady
●15ポイント

>何故か置き換えられる場合とそうでない場合があって…。


正規表現に無駄と思える部分が多い点が気になり、シンプルにしてみました。PHPの環境が無いので動作確認していませんが…どうでしょう?


(<br />)*(>|>)+([^(<br />)]+)<br />

<p>¥¥2¥¥3</p>

◎質問者からの返答

回答ありがとうございます!

>正規表現に無駄と思える部分が多い

やっぱりそうですよね。私も、絶対もっと簡潔に出来るよなぁ…と思いつつも方法が分からずじまいで。

回答の正規表現でほぼ出来ました!

でも、マッチする部分に半角カッコがあると、マッチしないようなのです。

例で言うなら

>バナナ(美味)

のような場合です。

正規表現の中で半角カッコを使っているからでしょうか…?


4 ● mady
●15ポイント

原因は[]の中身は()を書いたとしてもグループ化されず、

それぞれ単独の文字として扱われる仕様が原因のようですね…。


一般的な正規表現では「これらの文字以外」という指定はできても

「これらの文字列以外」という指定はできない…ような気がします。


本質的な解決にはなっていませんが、とりあえずの応急処置で

こんなのはどうでしょう?


(<br />)*(>|>)+([^<>]+)<br />

◎質問者からの返答

なるほど。

(
)*(>|>)+([^<>]+)

でいけました。

でも今気づいたのですがこれですと行頭以外の>にもマッチしてしまうような。


5 ● ke_ishi
●25ポイント

・<br />除去の精度にこだわらない

・文中にタグ以外の<が出現しない(これを出したければ&lt;と書いてほしいですが)

という条件に合致するのであれば、これで。


$str = mb_ereg_replace(’(^([>>][^<]+)<br />|(<br />)+([>>][^<]+)<br />)’, ’<p>¥2¥4</p>’, $str);

◎質問者からの返答

出来ました!!

ありがとうございます!

なるほど、こうすれば良いのですね。

--

皆様ありがとうございました!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ