ویژگی تصویر

تابع nl2br() در PHP

  /  PHP   /  تابع nl2br() در PHP
بنر تبلیغاتی الف
آموزش PHP

تابع nl2br() یکی از توابع ساده و پرکاربرد در PHP است که خط‌های جدید (newline) را در یک رشته به تگ‌های <br> یا <br /> تبدیل می‌کند. این تابع وقتی می‌خواهید متن چندخطی کاربر را در خروجی HTML با همان شکست‌های خط نمایش دهید بسیار مفید است.

نحو و پارامترها

نحو کلی تابع به این صورت است:

string nl2br(string $string, bool $is_xhtml = true)

پارامترها:

  • $string: رشته‌ای که می‌خواهید تبدیل انجام شود.
  • $is_xhtml (اختیاری): اگر true باشد تگ <br /> تولید می‌شود؛ اگر false باشد تگ <br> تولید می‌شود. مقدار پیش‌فرض true است.
ورودی newlineتبدیل شده
rn (Windows)تبدیل به <br /> یا <br>
n (Unix/Linux)تبدیل به <br /> یا <br>
r (Mac قدیمی)تبدیل به <br /> یا <br>

مثال ساده

<?php
$text = "خط اولnخط دومrnخط سومrخط چهارم";
echo nl2br($text);
?>

در این مثال تمام نوع‌های رایج شکست خط (LF، CRLF، CR) به تگ‌های <br /> تبدیل می‌شوند و خروجی در مرورگر هر خط را در سطر جدا نشان می‌دهد.

نکات امنیتی: استفاده همراه با htmlspecialchars

نکتهٔ بسیار مهم: nl2br فقط شکست خط را تبدیل می‌کند و رشته را جهت‌ایمن‌سازی نمی‌کند. اگر متن ورودی شامل کد HTML یا جاوااسکریپت باشد، نمایش مستقیم آن ممکن است منجر به XSS شود. بنابراین برای نمایش متن آزاد کاربران، ابتدا باید رشته را HTML-escape کنید سپس nl2br را اعمال کنید.

<?php
$raw = $_POST['comment'] ?? '';
// امن‌سازی و حفظ شکست خط:
$safe = nl2br(htmlspecialchars($raw, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'));
echo $safe;
?>

در این کد ابتدا با htmlspecialchars کاراکترهای HTML خاص به موجودیت‌های امن تبدیل شده‌اند و سپس nl2br شکست خط‌ها را به تگ تبدیل می‌کند. ترتیب مهم است: اگر اول nl2br را اجرا کنید و سپس htmlspecialchars، تگ‌های <br /> هم escape می‌شوند و در خروجی به‌صورت متن ظاهر می‌شوند که مطلوب نیست.

وقتی نباید از nl2br استفاده کنید

  • اگر متن حاوی HTML معتبر است و می‌خواهید آن را بدون تغییر نشان دهید (مثل متن حاوی تگ‌های بلاک)، nl2br ممکن است ساختار HTML را خراب کند.
  • اگر نیاز به تبدیل تنها شکست‌های خطی خارج از تگ‌های HTML دارید — nl2br به تشخیص داخل/خارج تگ‌ها حساس نیست و همهٔ شکست‌ها را تبدیل می‌کند.
  • برای نمایش متن بلند در CSS بهتر است از white-space: pre-wrap; استفاده کنید تا نیازی به افزودن تگ‌های <br> نداشته باشید.

جایگزین‌های مفید

  • استفاده از CSS: white-space: pre-wrap; یا white-space: pre-line; برای حفظ شکست خط بدون افزودن تگ‌های HTML.
  • اگر می‌خواهید تنها شکست‌های خط خارج از تگ‌ها را تبدیل کنید، باید از پردازش DOM یا کتابخانه‌هایی مثل HTMLPurifier یا پارسرهای مبتنی بر DOM استفاده کنید.

مثال: استفاده در قالب (Template)

// فرض کنید $post['body'] از دیتابیس آمده
echo '<div class="post-body">' . nl2br(htmlspecialchars($post['body'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')) . '</div>';

این الگو مناسب انجمن‌ها یا وبلاگ‌هاست؛ متن کاربر امن شده و شکست خط‌ها حفظ می‌شوند. اگر از سیستم template استفاده می‌کنید، می‌توانید این منطق را در فیلتر خروجی مرکزی قرار دهید تا همه جا یکسان عمل کند.

مثال پیشرفته: تبدیل تنها در متن‌های خام با حفظ HTML مجاز

اگر می‌خواهید برخی تگ‌های HTML را مجاز نگه دارید و در عین حال شکست خط‌ها را تبدیل کنید، ترکیب strip_tags یا HTML purifier و سپس nl2br راهکار است:

// اجازه به برخی تگ‌ها، سپس تبدیل شکست خط
$allowed = '<b><i><a>';
$clean = strip_tags($raw, $allowed);
echo nl2br(htmlspecialchars($clean, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'));

توضیح: ابتدا تگ‌های غیرمجاز حذف می‌شوند، سپس متن escape شده و nl2br اجرا می‌گردد. توجه داشته باشید strip_tags تگ‌های مجاز را به شکل خام حفظ می‌کند، بنابراین اگر می‌خواهید آن‌ها نیز امن باشند از HTML purifier استفاده کنید تا حملات پیچیده‌تر فیلتر شوند.

بهینه‌سازی و عملکرد

nl2br تابعی سبک و سریع است و برای بیش‌تر کاربردهای معمول کافی است. اما در صفحاتی که هزاران فراخوانی در حلقه دارند، می‌توانید:

  • پیام‌ها را یکبار در زمان ذخیره‌سازی پردازش کنید (caching) تا در زمان نمایش پردازش نشود.
  • از قابلیت‌های کش سمت سرور یا template caching استفاده کنید.

جمع‌بندی و بهترین شیوه‌ها

  • nl2br تابع ساده و مفید برای تبدیل newline به تگ <br> است.
  • برای جلوگیری از XSS همیشه قبل یا بعد از nl2br از روش‌های امن‌سازی مناسب استفاده کنید؛ ترتیب صحیح معمولاً ابتدا htmlspecialchars سپس nl2br است.
  • اگر متن حاوی HTML است یا نیاز به پردازش ظریف‌تری دارید، از کتابخانه‌های تخصصی یا CSS استفاده کنید.
  • پارامتر دوم $is_xhtml مشخص می‌کند که خروجی از نوع XHTML باشد یا HTML سنتی.

استفاده هوشمندانه از nl2br همراه با اصول امنیتی و در نظر گرفتن نیازهای نمایشی باعث می‌شود متن‌های چندخطی به‌خوبی و امن در صفحات وب نمایش داده شوند.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: