Пробел или   в регулярном выражении

Рейтинг: 0Ответов: 1Опубликовано: 07.03.2015

У меня есть строка:

<span itemprop="ratingCount">32 680</span>

Мне нужно получить

ratingCount">36 345

Делаю

#ratingCount\"\>(\w*)*(?:\s|&nbsp;)*(\w*)#

Получаю

ratingCount">36

Какова причина того, что символы после пробела обрезаются?

Примечание: символов не всегда равное количество, бывает, что пробела в строке нет.

Ответы

▲ 1Принят

Ну, пройдемся

(\w*)*

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

(?:\s|&nbsp;)*(\w*)

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

  • Регулярное выражение должно заканчиваться на начале следюущего тега, а не там, где оно захочет (как здесь)
  • У нас должен быть как минимум один символ совпадения, а значит: (\w*)(?:\s|&nbsp;)*(\w+)
  • Нам вообще не нужны три последовательные подмаски: ([\w]+(?:(?:\s|&nbsp;)\w+)*)
  • В конце концов, нас интересует, все содержимое тега: \>([^\<]*)\<

Теперь о подходе вообще.

Забудьте о парсинге HTML с помощью регулярок. Завтра у вас с этим совпадет <div id="ratingCount">XX XX</div>, но не совпадет <span itemprop="ratingCount"> 32 32</span>. Есть куча замечательных библиотек, чтобы работать с html, лично я использую symfony/dom-crawler.