Основной вопрос PHP регулярных выражений - PullRequest
2 голосов
/ 21 мая 2009

У меня есть HTML-файл, в котором я хотел бы получить весь текст внутри этих двух тегов:

<div class="articleTitle">
</div> 

Я не совсем уверен, как сделать регулярное выражение php. (Я также знаю, что внутри div нет html-тегов, поэтому нет проблем с вложенными тегами)

обновление: когда я пытаюсь получить данные решения, я получаю следующее: Предупреждение: preg_match () [function.preg-match]: неизвестный модификатор 'd' в строке 29

Ответы [ 4 ]

4 голосов
/ 21 мая 2009
preg_match('/<div class="articleTitle">(.*?)<\/div>/i', $source, $matches);
print_r($matches);

Это "объяснение" от RegexBuddy:

<div class="articleTitle">(.*?)</div>

Options: case insensitive

Match the characters “<div class="articleTitle">” literally «<div class="articleTitle">»
Match the regular expression below and capture its match into backreference number 1 «(.*?)»
   Match any single character that is not a line break character «.*?»
      Between zero and unlimited times, as few times as possible, expanding as needed (lazy) «*?»
Match the characters “</div>” literally «</div>»

Created with RegexBuddy

(. *?) Будет захватывать все между тем, что предшествует, и тем, что следует за ним, и это будет место в переменной $ match.

Я предполагал, что HTML будет в переменной $ source.

Я предлагаю вам взглянуть на RegexBuddy , это 39,95 (USD), но оно того стоит. Он может помочь в создании ваших RegEx с большинством основных реализаций RegEx, а также может помочь вам изучить RegEx

2 голосов
/ 21 мая 2009

Неправильные ответы!

preg_match('#<div\s+[^>]*class="articleTitle"[^>]*>(.*)</\s*div>#ims', $str, $matches);
  1. DIV может быть пустым, поэтому паттерны типа (. +) Неверны.
  2. Вы должны использовать модификатор "m" - содержимое может быть многострочным.
  3. Вы должны использовать модификатор "s", чтобы сопоставить метасимвол точки как символ новой строки.
  4. Просто удивительно, зачем убивать косую черту, если pattens в php может иметь ЛЮБОЙ разделитель? Обычно в этом случае я использую # в качестве разделителя.
  5. DIV может иметь дополнительные атрибуты и / или пробелы (включая символы новой строки).

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

PS: и, GONeale, о жадности - шаблон должен быть жадным и жадным без модификатора "U".

0 голосов
/ 21 мая 2009
'/<div class="articleTitle">(.*?)<\/div>/'

Как правило, будет работать; однако если вам нужно учесть другие возможные атрибуты в теге div, это будет немного сложнее.

0 голосов
/ 21 мая 2009

Это было бы более правильно, поскольку другие решения соответствовали бы

, что, вероятно, нежелательно?
preg_match('<div class="articleTitle">(.+?)</div>', $test_string, $matches);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...