Регулярные выражения - где ангелы боятся идти - PullRequest
0 голосов
/ 29 января 2011

Я только начал изучать регулярные выражения в PHP, но я ужасно провожу время, следуя некоторым учебникам в WWW, и не могу найти ничего, что отвечало бы моим текущим потребностям.Возможно, я пытаюсь выучить слишком много слишком быстро.Этот аспект PHP совершенно новый для меня.

Я пытаюсь создать регулярное выражение для замены всего HTML-кода между n-ными вхождениями и на любой код, который я выберу..

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

...
, и т.д., и т.д. 1018 * Например, если страница имеет порно объявление, содержащееся в 5
...
блок в пределах страницы, то, что регулярное выражение может быть использовано длянацелить и заменить этот код чем-то другим, например, xxxxxxx, но только на 5-й
блок на странице и ничего больше?

Вся веб-страница содержится в одной текстовой строке, и отфильтрованный результат также долженбыть одной строкой текста.

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

$FilteredPage = preg_replace("REG EXPRESSION", "xxxxxxxx", $OriginalPage);

"REG EXPRESSION" для вызова - это то, что мне нужно знать, и "xxxxxxxx"представляет текст для замены кода между тегами, на которые нацелен «REG EXPRESSION».

Регулярные выражения, очевидно, являются работой сатаны!

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

Спасибо, Джей

Ответы [ 3 ]

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

Во-первых, вы используете правильный инструмент для работы? Regex - это механизм сопоставления текста, а не полноценный анализатор - возможно, выделенный анализатор HTML даст лучшие результаты.

Во-вторых, подходя к любой проблеме программирования, постарайтесь упростить свою задачу и строить ее по кирпичику, а не просто прыгать прямо к окончательному решению. Например, вы могли бы:

Начните с простого блока обычного английского текста и попробуйте сопоставить и заменить (например) каждое вхождение слова «и».

Когда это сработает, оберните его в цикл PHP, который может сосчитать до 5 и заменить только 5-е вхождение. Зачем использовать регулярные выражения для подсчета, когда PHP намного лучше справляется с этой задачей?

Затем измените свое регулярное выражение, чтобы оно соответствовало вашему 5-му HTML-тегу (что немного сложнее, поскольку <> являются специальными символами и требуют экранирования)

Приступая к решению проблемы поэтапно, вы сможете заставить каждую деталь работать по очереди и построить твердое решение, которое вы понимаете.

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

Это было сделано до смерти, но, пожалуйста, не используйте регулярные выражения для разбора HTML.Просто остановись, сдайся ... Это не стоит того, чтобы тебя убил бог котят.используйте настоящий анализатор HTML или XML

В более конструктивном плане рассмотрим xpath как технологию, лучше подходящую для описания узлов HTML, которые вы, возможно, захотите заменить ... или phpQuery и QueryPath

Причина, по которой Бог убивает котят, когда вы анализируете HTML с помощью регулярного выражения:

HTML не является обычным языком, поэтому регулярное выражение может анализировать только очень ограниченный HTML.HTML является языком без контекста, и поэтому может быть правильно проанализирован только с помощью синтаксического анализатора без контекста.

Редактировать: спасибо @ Эндрю Гримм, это сказано намного лучше, чем я мог, о чем свидетельствует первый ответ с более чем четырьмя тысячами ответами!

RegEx соответствует открытым тегам, кроме автономных тегов XHTML

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

хорошо, несколько основных правил.

  • Не публикуйте вопрос, подобный этому, до того, как задать вопрос, вы только оттолкнете людей
  • Регулярные выражения потрясающие!
  • Если вы хотите рассмотреть варианты, посмотрите, как читать html как документ xml, и проанализируйте его, используя xpath
  • @ tobyodavies в значительной степени правильно, я включу ответ, если вы все равно захотите это сделать

Теперь к вашей проблеме. С этим:

$regex = "#<div>(.+?)</div>#si";

Вы должны быть в порядке, используя это выражение и считая вхождения, очень похоже на это:

preg_match_all($regex, $htmlcontent, $matches, PREG_SET_ORDER );

Предположим, вам нужен только пятый. Matches [$ i] [0] - вся строка совпадения $ i-eth

if (count($matches) > 5 )
{
   $myMatch = $matches[5][0];
   $matchedText = $matches[5][1];
}

Удачи в ваших усилиях ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...