PHPでの正規表現の質問です。

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

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

例えば、

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

なら、

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

としたいのです。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/05/02 17:12:37
  • 終了:--

回答(5件)

id:ke_ishi No.1

ke_ishi回答回数269ベストアンサー獲得回数02005/05/02 17:39:58

ポイント15pt

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);


とか

id:wintarsnow

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

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

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

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

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

”,$str);

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

2005/05/02 20:01:58
id:izayoimizuki No.2

izayoimizuki回答回数302ベストアンサー獲得回数02005/05/02 22:02:25

ポイント20pt

<?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;

?>

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

id:wintarsnow

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

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

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

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

2005/05/02 22:30:26
id:mady No.3

mady回答回数86ベストアンサー獲得回数02005/05/03 09:37:11

ポイント15pt

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


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


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

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

id:wintarsnow

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

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

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

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

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

例で言うなら

>バナナ(美味)

のような場合です。

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

2005/05/03 12:45:20
id:mady No.4

mady回答回数86ベストアンサー獲得回数02005/05/03 15:18:04

ポイント15pt

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

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


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

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


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

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


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

id:wintarsnow

なるほど。

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

でいけました。

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

2005/05/03 16:14:03
id:ke_ishi No.5

ke_ishi回答回数269ベストアンサー獲得回数02005/05/03 20:15:39

ポイント25pt

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

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

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


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

id:wintarsnow

出来ました!!

ありがとうございます!

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

--

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

2005/05/03 20:30:07

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません