0

正規表現を使用して検索<a class="modal>し、置き換えるにはどうすればよい<a class="modal-link"ですか?

私は試した:

preg_replace('/<a class="(.*?)">(.*?)<\/a>/i', '<a class="$1-link">$2</a>', $input);

しかし、それは機能していません。誰かが私に正しい解決策を指摘してもらえますか?

ちなみに、私はJoomla 2.5のフロントページ編集コンテンツページをスタイリングしています。ここでは、承認されたユーザーが記事を投稿できます。正規表現に適用したい文字列は次のとおりです。

<?php echo $this->form->getInput('image_intro', 'images'); ?>

次のHTMLを生成します。

<a class="modal" ...>Choose</a>
4

3 に答える 3

6

DOMDocumentPHPのクラスを使用する非正規表現ベースのソリューションは次のようになります。

// Load up the HTML in DOMDocument
$doc = new DOMDocument;
$doc->loadHTML( '<a class="modal">Stuff</a>'); // Or: $doc->loadHTML( $this->form->getInput('image_intro', 'images'));

// Create a new XPath object to find the correct <a> tags
$xpath = new DOMXPath( $doc);

// Iterate over all <a class="modal"> tags
foreach( $xpath->query( "//a[@class='modal']") as $a) {
    // Set the class attribute correctly
    $a->setAttribute( 'class', $a->getAttribute( 'class') . '-link');
    echo $doc->saveHTML( $a); // Print the fixed <a> tag
}

これにより、次のようなものが出力されます。

<a class="modal-link">Stuff</a>

このメソッドは、特にユーザー入力からHTMLを取得する場合、正規表現ベースのアプローチよりも堅牢で安定しています。

于 2013-01-08T19:31:27.950 に答える
4

正規表現は問題ありません。preg_replaceは$input変数を変更しません。

試す

$new_string = preg_replace('/<a class="(.*?)">(.*?)<\/a>/i', '<a class="$1-link">$2</a>', $input);

ただし、HTMLを解析するために正規表現を使用しないでください

于 2013-01-08T19:29:52.267 に答える
1

正規表現を使用してこれを確実に、または十分に実行する方法はありませんが、大まかな検索と置換で実行できる場合は、次のように実行できます。

$code = '<a class="modal">Choose</a>';
$regex = '/(?<=\sclass=")modal(?="[\s>])/';
echo preg_replace($regex, 'modal-link', $code);

これが悪い考えである理由は少なくとも2つあります。

  1. 正規表現を使用してHTMLを解析または変更しないでください。HTMLの解析や変更は通常の問題ではなく、非常に複雑で複雑な問題です。正規表現を使用することは、ノミを使用する必要があるときにハンマーを使用することに似ています。

  2. いかなる場合でも、HTMLコードを変更しないでください。HTMLはHTMLである必要があります。HTMLを別のものにする必要がある場合は、ソースでHTMLを変更する必要があり、このような形に強制しないでください。

于 2013-01-08T19:41:17.520 に答える