Соответствие нескольких заключенных в одну строку строк - PullRequest
0 голосов
/ 12 апреля 2019

<!--:en-->Motodays 2014, 6.-9. of March<!--:--><!--:it-->Motodays 2014, 6-9 Marzo<!--:--> Это строка, которую я хочу сопоставить.Я хочу сопоставить содержимое внутри 2 HTML-подобных тегов комментариев.

Итак, я попытался: <!--:(..)-->(.+)<!--:--> и некоторые дополнительные производные этого регулярного выражения, но не смог найти решение, которое возвращает ожидаемые результаты.Я также попробовал (|), который проверяет, существуют ли 2 таких тега, но результаты были ненадежными, потому что ему также нужно управлять 3 или более совпадениями.

Это результат preg_match:

array(
0 => <!--:en-->Motodays 2014, 6.-9. of March<!--:--><!--:it-->Motodays 2014, 6-9 Marzo<!--:-->
1 => en
2 => Motodays 2014, 6.-9. of March<!--:--><!--:it-->Motodays 2014, 6-9 Marzo
)

Вот чего я хочу достичь:

array(
0 => <!--:en-->Motodays 2014, 6.-9. of March<!--:--><!--:it-->Motodays 2014, 6-9 Marzo<!--:-->
1 => en
2 => Motodays 2014, 6.-9. of March
3 => it
4 => Motodays 2014, 6-9 Marzo
)

РЕДАКТИРОВАТЬ: Ответ предлагает использовать preg_match_all(); Полученный массив немного отличается, но форма еще более практична, чем другой.

array(
0=>array(
  0=><!--:en-->Motodays 2014, 6.-9. of March<!--:-->
  1=><!--:it-->Motodays 2014, 6-9 Marzo<!--:-->
)
1=>array(
  0=>en
  1=>it
)
2=>array(
  0=>Motodays 2014, 6.-9. of March
  1=>Motodays 2014, 6-9 Marzo
)
)

1 Ответ

1 голос
/ 12 апреля 2019

(.+) является жадным и идет до последнего матча. Я бы порекомендовал добавить ?, чтобы сделать его нежадным. Я бы тоже использовал preg_match_all.

Я думаю:

<!--:([a-z]{2})-->(.*?)<!--:-->

достигнет того, что вы хотите.

https://regex101.com/r/tMN6km/1/

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