0

PHPで、すべての段落要素を配列のように配置する関数を探しています<p>, <ul> and <ol>。最初の2つの段落を表示したり、他の段落を非表示にしたりするように、段落を操作できるようにします。

この関数は、p要素のトリックを実行します。ulとolにも一致するように正規表現を調整するにはどうすればよいですか?私のトライアウトでエラーが発生します:<は演算子ではありません...

function aantalP($in){
    preg_match_all("|<p>(.*)</p>|U",
        $in,
        $out, PREG_PATTERN_ORDER);
    return $out;
}

//tryout:
    function aantalPT($in){
        preg_match_all("|(<p> | <ol>)(.*)(</p>|</o>)|U",
            $in,
            $out, PREG_PATTERN_ORDER);
        return $out;
    }

誰か助けてもらえますか?

4

2 に答える 2

3

正規表現ではこれを確実に行うことはできません。段落は一般的にネストされていないため、ほとんどの場合問題ありません(ただし、ネストすることはできます)。ただし、リストは定期的にネストされており、正規表現が該当する領域の1つです。

PHPには、HTMLを解析し、選択した要素を取得する方法が複数あります。それらの1つを使用してください。はるかに堅牢になります。

PHPとDOMを使用したHTMLの解析から始めます。

本当に正規表現ルートをたどりたい場合は、次のように開始します。

function aantalPT($in){
  preg_match_all('!<(p|ol)>(.*)</\1>!Us', $in, $out);
  return $out;
}

注: PREG_PATTERN_ORDERデフォルト値であるため、必須ではありません。

基本的に、後方参照を使用し一致するタグを見つけます。ネストされたリストやリスト内にネストされた段落など、多くの理由で失敗します。いいえ、これらの問題は正規表現では(確実に)解決できません。

編集:(正しく)指摘されているように、正規表現にはパイプ区切り文字が使用されており、正規表現でパイプ文字を使用していたという点でも欠陥があります。私は一般的に使用します!これは通常、パターンでは発生しません(とにかく私のパターンでは発生しません)。スラッシュを使用するものもありますが、このパターンでも表示されます。チルダ(〜)は、もう1つの合理的に一般的な選択肢です。

于 2009-09-21T10:43:19.720 に答える
2
  • まず、|を使用します 正規表現の開始と終了を示す区切り文字として。しかし、あなたも使用します| または記号として。最初と最後を交換することをお勧めします| と #。
  • 次に、次のように開始タグと終了タグをキャプチャする後方参照を使用する必要があります。<(p|ul)>(.*?)</\1>
于 2009-09-21T10:46:34.997 に答える