используйте preg match и replace для замены тегов li внутри тегов ol - PullRequest
1 голос
/ 29 января 2011

Вот что я получил:

<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, он также изменяет теги li внутри тегов ul, и я хочу, чтобы он заменял только теги ol. В чем может быть проблема и как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 29 января 2011

В 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)
0 голосов
/ 29 января 2011

Проблема в вашем регулярном выражении, скорее всего, в жадности.Вы должны добавить вопросительный знак к .*?, чтобы он соответствовал меньшим отступам.

Однако было бы более надежным, если бы вы не пытались выполнить это с помощью одного регулярного выражения.Это всегда немного сложнее, чем идти простым путем:

$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").Хотя фактическая замена будет в большей степени связана с этим подходом.

...