Почему шаблон регулярных выражений не соответствует коду?

#php #regex #preg-match-all

#php #регулярное выражение #preg-match-all

Вопрос:

У вас есть какие-либо идеи, почему это регулярное выражение не соответствует приведенному ниже коду?

 $regex = "!<title>(.*?)</title>!i";
  

код:

 <b:include data='blog' name='all-head-content'/>
<title>
    <b:if cond='data:blog.homepageUrl == data:blog.url'>
        <data:blog.title/>
    <b:else/>
        <data:blog.pageName/> amp;raquo; <data:blog.title/>
    </b:if>
</title>
<link href='http://fonts.googleapis.com/css?family=Open Sans:400,700' rel='stylesheet' type='text/css'/>
  

Ответ №1:

Не используйте регулярные выражения для синтаксического анализа XML.

Ваше выражение не работает, потому что точка не соответствует новым строкам. Добавление модификатора /.../s DOTALL исправило бы это, но тогда у вас возникнут другие проблемы, такие как жадное сопоставление вместо ленивого.

Использование синтаксического анализатора XML было бы лучшей идеей.

Комментарии:

1. Является b:include допустимым тегом HTML?

2. Спасибо, Марк, это решило мою проблему! Это шаблон blogger, который необходимо проанализировать и загрузить.

3. @hakre: это фрагмент документа HTML5 в пространстве имен XML?

4. Безусловно, нет 😉 Однако я думаю, что мой вывод также неверен. Даже если он будет находиться в пространстве имен XML, это будет недопустимый HTML5.

Ответ №2:

Вот мое предложение для правильного регулярного выражения:

 (?<=<title>)(.*)(?=</title>)
  

Комментарии:

1. Я попробовал! Публикация без тестирования — это не моя работа!