- ベストアンサー
PHP5正規表現でマッチングできない問題についての解決方法
- PHP5の正規表現を使用して文字列中の独自タグをパースする際に問題が発生しています。
- 期待した結果としては、<tag>タグの間の文字列を正しくマッチングさせることですが、実際には全てのタグが一つのマッチとして扱われます。
- この問題を解決するために、正規表現パターンを修正する必要があります。具体的な方法としては、マッチしたタグの末尾に ? を追加することで、最短マッチングを行うことができます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
/<tag>.*?<\/tag>/ にすると良いと思います。 http://stackoverflow.com/questions/5079243/regular-expression-in-php-take-the-shortest-match
その他の回答 (1)
最短マッチを使ってもいいですが、最速の正規表現を書くならば独占的最長マッチを用いて @<tag>[^<]*+</tag>@ とする方がオススメです。また、おそらく >> 実際は、 >> $result[0]:<tag>こんにちは</tag><tag>こんばんは</tag> >> となりました。 において $result[0] → $result[0][0] の誤りですよね。欲しいのはInnerHTMLだと思うので @<tag>([^<]*+)</tag>@ として、 $result[0][0] … OuterHTML $result[1][0] … InnerHTML にセットされるようにしてみましょう。なお、配列生成方式には - PREG_PATTERN_ORDER(デフォルト) - PREG_SET_ORDER の2種類がありますが、 「OuterHTMLもInnerHTMLも両方扱いたい」 という場合は PREG_SET_ORDER に変更したほうが使い勝手が向上するでしょう。この場合では $result[0][0] … OuterHTML $result[0][1] … InnerHTML となります。逆に 「InnerHTMLしか使わない」 という場合はデフォルトでいいと思います。
お礼
最短マッチを使うことにしました。 今後独占的最長マッチ使う場合もありえる為詳しく調べてみます。 返信ありがとうございました。
お礼
所要の振る舞いにすることができました。 返信ありがとうございました。