2010-11-02 3 views
0

Я боролся с этим в течение нескольких дней, и похоже, что мне действительно нужно спросить кого-то другого.PHP preg_replace 'e' modifier dilemma

Для целей этой темы, вот в чем проблема: я пытаюсь манипулировать строкой с использованием PHP preg_replace и модификатора 'e' для выполнения функции внутри нее. Я хочу изменить любой экземпляр [pdf]somefilename[/pdf] на <a href="somefilename.pdf">PDF</a> size('somefilename.pdf');

Так, например, возможно, [pdf]somefilename[/pdf] выведет ссылку на файл, за которым следует (137 МБ).

По какой-то причине, однако, часть (137 МБ) ставится на начало всей строки, а не там, где она должна быть. Кажется, что preg_replace оценивает все, а затем возвращается и выполняет функцию и просто бросает результат в начало строки.

Так что, если у меня было Some text blah, blah. Download the document: [pdf]somefilename[/pdf] регулярное выражение выводит (137MB) Some text blah, blah. Download the document: [link to document], когда он должен выход Some text blah, blah. Download the document [link to document] (137MB).

Я потерян. Google не может спасти меня. Кто-то, пожалуйста, помогите!

Спасибо заранее, Джефф

Вот код:

$bbcode_pdf_tag = '/\[pdf\](.*?)\[\/pdf\]/ie'; 
$html_pdf_tag = '"<a href=\"$1.pdf\">PDF</a>" .size("\\1.pdf")'; 
$decoded_data = preg_replace($bbcode_pdf_tag, $html_pdf_tag, $data); 

EDIT: Стоит отметить, что размер() определяется в совершенно другой файл, и это, кажется, не происходит, когда Я использую встроенную функцию, такую ​​как strtolower(). Определение функции size() внутри и использование preg_replace_callback не решает проблему.

+2

psst, размещение кода (или, по крайней мере, регулярного выражения) облегчит людям помощь вам. – CharlesLeaf

+0

Мы не можем помочь вам, не зная, что вы делаете. Пожалуйста, действительно укажите код *. –

+1

Пожалуйста, напишите свой запрос 'preg_replace', чтобы мы могли посмотреть. – netcoder

ответ

2

Вместо этого используйте preg_replace_callback! Опция «e» может быть опасной. Пример с preg_replace_callback:

preg_replace_callback('`\[pdf\]([^\[]+)\[/pdf\]`i', function ($matches) { return "<a href=\"{$matches[1]}\">PDF</a> " . filesize($matches[1]); }, $string); 

Вы можете, очевидно, сделать более сложную функцию, которая проверяет, существует ли файл или любой другой. Этот код использует анонимную функцию PHP 5.3, поэтому, если вы не используете PHP 5.3, вам нужно использовать старый синтаксис.

Редактировать: Я написал этот ответ, прежде чем видеть комментарии и отредактированный пост OP, поэтому я, возможно, что-то пропустил.

Edit2: Какая у вас функция размера? Похоже, что он печатает значение, а не возвращает его.

function test() { 
    echo "world"; 
} 

echo "hello " . test(); // worldhello 
+0

Спасибо за ваш ответ! Я знаю об опасностях модификатора «e» и написал версию с использованием обратного вызова, но имею ту же проблему. –

+0

Если я var_dump результат ('$ string =" blabla [pdf] test.php [/ pdf] blabla ";'): 'string (44)" blabla PDF 882 blabla "'. Проблема, вероятно, лежит где-то в другом месте. –

+1

Я просто подумал о чем-то. Ваша функция size() печатает значение вместо его возврата? 'echo" hello ". печать ("мир"); // worldhello1' –