Требуется помощь в форматировании регулярных выражений - PullRequest
0 голосов
/ 29 марта 2012

Я пытаюсь удалить часть документа на лету, используя preg_replace().

/* target example:
        <li id="footer-poweredbyico">
        <img src="//bits.wikimedia.org/skins-1.18/common/images/poweredby_mediawiki_88x31.png" alt="Powered by MediaWiki" width="88" height="31" />
        </li>
    */

$reg = preg_quote('<li id="footer-poweredbyico">.*?</li>');

preg_replace($reg,"",$str);

Игнорировать любые ошибки в PHP, этот вопрос о том, как правильно отформатировать регулярное выражение, чтобы удалить все, что соответствует открывающему и закрывающему тегам целевого примера. Содержимое HTML-тегов будет каждый раз отличаться, поэтому .*? (я думаю, что это неправильно).

Ответы [ 4 ]

4 голосов
/ 29 марта 2012

Функция preg_quote фактически противоположна тому, что вы хотите: ее целью является отключение всех регулярных выражений в строке. Итак, в вашем случае, то, что вы в данный момент имеете (примерно), ищет фактический .*? в вашем HTML, вместо того, чтобы искать ноль или более символов. То, что вы хотите:

$str = preg_replace('/<li id="footer-poweredbyico">.*?<\/li>/s', '', $str);
2 голосов
/ 29 марта 2012

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

$reg = preg_quote('<li id="footer-poweredbyico">') . '.*?' . preg_quote('</li>'); 

preg_replace($reg,"",$str);
2 голосов
/ 29 марта 2012

вам не нужно использовать этот взломанный подход, прочитайте FAQ

«Как я могу отредактировать / удалить изображение Powered by MediaWiki в нижнем колонтитуле?»

2 голосов
/ 29 марта 2012

preg_quote() отключит все специальные символы, которые вы использовали, например, .*?.

Попробуйте что-то вроде:

preg_replace('#<li id="footer-poweredbyico">.*?</li>#s', '', $str);

Теперь сложный вопрос заключается в том, чтобы сделать это регулярное выражение«жадный».Прямо сейчас, это нечестиво, что означает, что он сломает вашу страницу, если внутри той, которую вы пытаетесь удалить, будет <li>.Но если вы сделаете его жадным, он удалит все с начала тега <li> до конца последнего элемента <li> на странице, даже если это другой элемент <li>.Ни один не идеален.Вот почему правильный анализатор HTML обычно лучше справляется с манипулированием HTML.

Но если страница достаточно проста, сработает регулярное выражение.

РЕДАКТИРОВАТЬ Исправлена ​​грубая ошибка, благодаря @ Nilpo.

...