$text = [[自転車]]に乗った[[男]]がいる


$textから [[ ]] に囲まれた単語だけを抽出する正規表現は
preg_match_all('/\[\[(.*?)\]\]/',$text, $matches)
と書けました。


それでは
$text = [[自転車|バイク]]に乗った[[男]]がいる
から [[ ]] に囲まれていて、なおかつ | が入っている単語を抽出するのはどうすればいいでしょうか
上記の例なら、 自転車|バイク  と抽出したいのです。

preg_match_all('/\[\[(.*?\|.*?)\]\]/',$text, $matches)
と書いてみましたが、条件によっては変な抽出の仕方をしてしまいます。


よろしくお願いいたします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2007/12/13 21:10:10
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:showyou No.1

回答回数96ベストアンサー獲得回数10

ポイント35pt

具体的な回答がすぐには書けないですが、

要は

・|の前に]]が来ない

・|の後ろに[[が来ない

ことを条件をすれば良いのでは?

id:Mook No.2

回答回数1314ベストアンサー獲得回数393

ポイント35pt

うまくいかないケースというのは、[[××]] が [[×××|×××]]の前にあるケースでしょうか。

であれば、

preg_match_all('/\[\[([^\[]*?\|.*?)\]\]/',$text, $matches);

といった感じで回避できるかと思います。

  • id:tezcello
    > 変な抽出
    具体的には、どんな事になってしまうのでしょうか?
    質問文の例ではうまくいきますよね?
  • id:tokyosmash
    コメントありがとうございます。
    例えばこちらの文章だと抽出がうまくいきません。


     Internet Protocolとは[[インターネット]]において情報の伝達を行う[[通信プロトコル|プロトコル]]であり、インターネットの基礎部分となる重要な役割を持つ。


    この場合だと以下が抽出されます。


     インターネット]]において情報の伝達を行う[[通信プロトコル|プロトコル


    [[インターネット]]の部分に正規表現が反応してしまっているようです。

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

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

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

回答リクエストを送信したユーザーはいません