1

いつものように、良い正規表現を書くのに苦労します。

記事のタイトルの右側にあるコアによって生成されるオプションの印刷、電子メール、および PDF ボタンにボタンを追加する Joomla 用のプラグインを作成しようとしています。成功すれば、GPL の下で配布します。私が見つけた例はどれもうまくいかないようで、PHPのみのソリューションを作成したいと思います.

アイデアは、記事のタイトルに Joomla 出力の固有のパターンを使用し、1 つ以上の正規表現のボタンを使用することです。正規表現の 1 つは、クラスが「contentpaneopen」のテーブル (ページ内にいくつかあります) を探し、クラスが「contentheading」のセルを含むテーブルを見つけることで、適切なテーブルを見つけます。2 番目の正規表現は、そのテーブルにクラス "buttonheading" のセルがあるかどうかを確認できます。これらのセルの数は 0 から 3 まで可能ですが、最初の正規表現が複数の一致を返す場合は、このチェックを使用できます。これで、テーブルを同じテーブルに置き換えたいと思いますが、追加したいボタンを保持する余分なセルを使用します。これを行うには、最後の行とテーブルの終了タグを削除し、ボタン セルを挿入してからそれらの終了タグを再度追加します。

通常の Joomla 出力は次のようになります。

<table class="contentpaneopen">
    <tbody>
        <tr>
            <td width="100%" class="contentheading">
                <a class="contentpagetitle" href="url">Title Here</a>
            </td>
            <td width="100%" align="right" class="buttonheading">
                <a rel="nofollow" onclick="etc" title="PDF" href="url"><img alt="PDF" src="/templates/neutral/images/pdf_button.png"/></a>
            </td>
            <td width="100%" align="right" class="buttonheading">
                <a rel="nofollow" onclick="etc" title="Print" href="url"><img alt="Print" src="/templates/neutral/images/printButton.png" ></a>
            </td>
        </tr>
    </tbody>
</table>

コードは大まかに次のようになります。

$subject = $article;
$pattern1 = '[regex1]'; //<table class="contentpaneopen">etc</table>
preg_match($pattern, $subject, $match);
$pattern2 = '[regex2]'; //</tr></tbody></table>
$replacement = [mybutton];
echo preg_replace($pattern2, $replacement, $match);

適切な正規表現がなければ、残りのコードを実行する意味がほとんどないため、誰かがそれを手伝ってくれることを願っています!

4

3 に答える 3

2

これはSOでよくある質問であり、答えは常に同じです。正規表現は、HTMLまたはXMLの解析または処理には適していません。彼らが故障することができる多くの方法があります。PHPには、はるかに堅牢なHTMLパーサーが少なくとも3つ組み込まれています。

PHPとDOMを使用したHTMLの解析を見て、次のようなものを使用します。

$html = new DomDocument;
$html->loadHTML($source); 
$html->preserveWhiteSpace = false; 
$tables = $html->getElementsByTagName('table'); 
foreach ($tables as $table) {
  if ($table->getAttribute('class') == 'contentpaneopen') {
    // replace it with something else
  }
}
于 2009-11-04T01:42:07.560 に答える
1

提供したシナリオのプラグインは、ページを読み込むたびに呼び出されるため、正規表現のアプローチはdomの呼び出しよりも高速です。そのため、多くの人がこのアプローチを使用しています。Joomlaのドキュメントでは、提供されたシナリオの正規表現がdomアプローチを使用するよりも優れている理由もわかります。

ソリューションの問題は、Joomlaのデフォルトテンプレートと関連付けられていることです。class="contentheading"すべてのテンプレートで同じ構造を使用しているかどうかは覚えていません。このような拡張機能をGPLで使用する場合は、注意が必要です。

あなたがやろうとしていることは、テンプレートのオーバーライドとして私には思えます。詳細については、こちらをご覧ください。はるかに簡単なソリューションです。たとえば、記事のタイトルを作成するphp:

<div class="componentheading<?php echo $this->params->get('pageclass_sfx')?>">
    <h2><?php echo $this->escape($this->params->get('page_title')); ?></h2>
</div>

com_content記事テンプレートをオーバーライドし、>get('page_title')呼び出し後にpdfボタンのhtmlをエコーする必要があります。HTMLをエコーし​​たくない場合は、モジュールまたはコンポーネントを作成し、それをテンプレートにインポートしてから>get('page_title')、HTMLを表示するコンポーネントのメソッドを呼び出します。

このコンポーネントには、「PDFを表示(はい/いいえ)」などのさまざまなチェックボックスやその他の興味深いアクションを含めることができます。

于 2009-11-04T14:07:09.323 に答える
1

これに正規表現を使用する必要がある理由はありますか? DOM の解析ははるかに簡単です。

于 2009-11-04T01:21:52.533 に答える