Сопоставление регулярных выражений между фигурными скобками дает слишком много результатов

У меня есть куча текста, например:

foofoofooabcdefhjkldh389dn{pdf}images/1.pdf,100%,500{/pdf}hfnkjt8499duidjglkj

Я хотел бы извлечь следующее:

{pdf}images/1.pdf,100%,500{/pdf}

Итак, вот регулярное выражение, которое я сделал:

#{pdf}(.*?){/pdf}#

При проверке результатов я получаю обратно:

Array
(
[0] => {pdf}images/1.pdf,100%,500{/pdf}
[1] => images/1.pdf,100%,500
)

Я ожидал получить только первый элемент в массиве, но вместо этого есть два элемента. Я использую PHP и для тестирования я использую следующий веб-сайт: PHP Regex Tester

Как я могу получить только {pdf}...{/pdf} текст?

3 ответа

Решение

Вы используете группу в своем регулярном выражении. в вашем случае группа

(.*?)

Это заставляет PHP дать вам полный результат {PDF}sometext{/PDF} и sometext, найденный в первой группе.

просто попробуйте следующее, чтобы избавиться от группы:

#{pdf}.*?{/pdf}#

Используйте группу без захвата, чтобы центральный текст не отображался как обратная ссылка в массиве, и используйте утверждения нулевой ширины, чтобы обеспечить {pdf} часть не является частью матча:

#(?<={pdf})(?:.*?)(?={/pdf})#

Если вы хотите сохранить {pdf} разделители:

#{pdf}(?:.*?){/pdf}#

У вас нет двух результатов.

Проблема (это не проблема, однако) в том, что, вероятно, функция preg_match используется. Эта функция возвращает как весь соответствующий запрос, то есть {pdf}images/1.pdf,100%,500{/pdf} а также конечный результат, то есть images/1.pdf,100%,500,

Так что вам нужно всего лишь использовать $result[1] для дальнейшего разбора.

Другие вопросы по тегам