Сопоставление регулярных выражений между фигурными скобками дает слишком много результатов
У меня есть куча текста, например:
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]
для дальнейшего разбора.