preg_match с Zend_Mail_Part-> getContent()

#regex #preg-match #zend-mail

#регулярное выражение #preg-совпадение #zend-почта

Вопрос:

Следующий пример кода работает так, как ожидалось (он достигает if-блока, не переходит в else-блок):

 // In the real code, $content is a result of Zend_Mail_Part->getContent() (this method returns a string). 
$content = ' ----boundary_2_1dca5b3b-499e-4109-b074-d8b5f914404a Content-Type: application/octet-stream; name=abc.pdf Content-Transfer-Encoding: base64 JVBERi0xLjINJeLjz9MNCjIgMCBvYmo8PD4 DWVuZG9iag0zIDAgb2JqPDwvUG';

// NOTE: the regex has a trailing space
// name *?= *?"?(?<filename>.*?)"? 
if (preg_match('/name *?= *?"?(?P<filename>.*?)"? /i', $content, $matches))
{
    echo ('file name: ' . $matches['filename']);
}
else
{
    echo('<br>$content:<br/>');
    var_dump($content);

    echo('<br>preg_match result:<br/>');
    var_dump(preg_match('/name *?= *?"?(?P<filename>.*?)"? /i', $content, $matches));

    echo('<br>$matches:<br/>');
    var_dump($matches);
}
  

Однако, когда $content присваивается результирующее значение Zend_Mail_Part->getContent() , выполнение кода достигает else блока. Он не должен достигать else блока. Есть идеи, что может быть не так?

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

1. Без строки, которая является образцом того, что возвращается Zend_Mail_Part-> getContent(), вам трудно помочь.

2. Я думаю, что, возможно, я понял это. Возможно, я превышаю лимит возврата. Смотрите: nz.php.net/pcre.configuration#ini.pcre.backtrack-limit . Проверка теории.

3. Извините за вас, но теперь вы должны показать строку.

Ответ №1:

Мне нужно было использовать флаг свободного интервала:

 '/name *?= *?"?(?P<filename>.*?)"? /ix'
  

(Добавьте x )