1

これが私が得たものです:

<ol>
<li></li>
<li></li>
</ol>

<ul>
<li></li>
<li></li>
</ul>


if (preg_match("/<ol>.*(<li(|\s*\/)>).*<\/ol>/Ums", $text->Bodytext)) {
$cleanlist = preg_replace("/(<li(|\s*\/)>)/", "<li><tag>", $text->Bodytext);

このphpコードは、ページにolタグのみが含まれている場合はうまく機能しますが、何らかの理由でulタグとolタグの両方が含まれている場合は、ulタグ内のliタグも変更され、olタグ内でのみ置き換えられます。何が問題である可能性があり、どうすれば修正できますか?

4

2 に答える 2

0

正規表現の問題は、貪欲である可能性があります。疑問符を追加して、.*?パディングが少なくなるようにする必要があります。

ただし、単一の正規表現でそれを達成しようとしなかった方が信頼性が高くなります。それは常に、単純なルートを実行するよりも少し複雑です。

$html = preg_replace_callback('#<ol>(.*?)</ol>#Us', "change_li", $html);
function change_li($m) {
    return preg_replace('#<li>#', '<li><tag>', $m[0]);
}

ミームポスターが登場する前に、正規表現を使用することは最も信頼できるアプローチではありません。あなたが奇抜なHTMLを持っていない限り、それはあなたのケースで実行可能です。別の方法は、 phpQueryまたはQueryPathを使用することですが、マッチングはと同じくらい簡単qp($html)->find("ol")->find("li")です。実際の交換は、そのアプローチにさらに関与しますが。

于 2011-01-29T07:05:39.897 に答える
0

PHP 5.3では、このタスクは次のように実行できます。

        $input = <<<END
<ol>
<li></li>
<li></li>
</ol>

<ul>
<li></li>
<li></li>
</ul>
END;



        $result = preg_replace_callback(
                "/(<ol>.*<\/ol>)/Ums",
                function ($ol) {
                    return preg_replace("/(<li(|\s*\/)>)/", "<li><tag>", $ol[1]);                    
                },
                $input
        );

        var_dump($result);

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

        string '<ol>
<li><tag></li>
<li><tag></li>
</ol>

<ul>
<li></li>
<li></li>
</ul>' (length=72)
于 2011-01-29T07:14:47.170 に答える