Почему это регулярное выражение не совпадает? - PullRequest
1 голос
/ 24 августа 2009

Он должен соответствовать тексту внутри любых тегов h1, h2 или h3.

preg_match("<[hH][1-3][^>]*>(.*?)<[hH][1-3]>", $text, $matches);
echo $matches[0];

Но это никогда не ловит никого.

Ответы [ 4 ]

6 голосов
/ 24 августа 2009

Вам не хватает косой черты в конце тега и вокруг регулярного выражения. Попробуйте это:

preg_match("/<[hH][1-3][^>]*>(.*?)<\/[hH][1-3]>/", $text, $matches);
echo $matches[0];

Ваше регулярное выражение ищет <h1>Text<h1>, а не <h1>Text</h1>. Добавление косой черты захватит фактический HTML.

5 голосов
/ 24 августа 2009

Вам нужны разделители регулярных выражений, отличные от тех, которые вы эффективно используете (угловые скобки) И косая черта на закрывающем теге. Я также рекомендую захватить открывающий тег и требовать, чтобы закрывающий тег был таким же.

preg_match('!<(h[1-3])[^>]*>(.*?)</\1>!i', $text, $matches);
echo $matches[1];
0 голосов
/ 24 августа 2009

Я сделал некоторые улучшения в коде Эрика. Теперь это соответствует < h2 ><h1></h1></ h2 > (не то, чтобы это когда-либо происходило). Есть еще некоторые проблемы, например попробуйте <h1><!--</h1>--></h1>.

preg_match("/<\s*[hH]([1-3])\s*>(.*?)<\/\s*[hH]\1\s*>/", $text, $matches);
echo $matches[0];  // the entire matched string
echo $matches[2];  // the contents between the tags
0 голосов
/ 24 августа 2009

Как минимум, вам не хватает разделителей в регулярном выражении:

preg_match("/<[hH][1-3][^>]*>(.*?)<[hH][1-3]>/", $text, $matches);
echo $matches[0];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...