PDA

View Full Version : استفاده از regular_expressions



mehdi4467
چهارشنبه 13 اردیبهشت 1391, 08:24 صبح
سلام
کد زیر میاد و در صفحه هر جا که یک لینک دید به جای اون message$ رو قرار می دهد.


$message = preg_replace('#<a href="(.*?)</a>#i', $lang->reglinks_text, $message);

حال من می خواهم لینکهایی که با مثلا test.com شروغ میشه رو تغییری توش نده.
مثلا اگر یک لینکی به شکل زیر در صفحه بود:

http://www.barnamenevis.org/index.php
این لینک رو پنهان کنه و به جاش message$ رو نمایش بده.
ولی روی لینک

http://test.com/index.php کاری نکنه و خودش رو نشون بده.

ممنون

MMSHFE
چهارشنبه 13 اردیبهشت 1391, 10:25 صبح
$message = preg_replace('#<a href="(?!test.com)(.*)</a>#i', $lang->reglinks_text, $message);
موفق باشید.

Hamid.RDN
چهارشنبه 13 اردیبهشت 1391, 10:29 صبح
با اجازه کد شمارو یکم تغییر میدم


$message = preg_replace('#<a href="(?!test.com)(.*?)</a>#is', $lang->reglinks_text, $message);

mehdi4467
چهارشنبه 13 اردیبهشت 1391, 10:47 صبح
با اجازه کد شمارو یکم تغییر میدم


$message = preg_replace('#<a href="(?!test.com)(.*?)</a>#is', $lang->reglinks_text, $message);

سلام
کد اول کار کرد.
فرق کد شما با کد اولی چیه؟

ممنون

Hamid.RDN
چهارشنبه 13 اردیبهشت 1391, 11:22 صبح
فرق توی بازیابی حریصانه هست.

به این شکل که در کد اول اگر چند تگ a داشته باشیم همه اونها یکجا replace خواهند شد و این یعنی از بین رفتن تمام لینکها و متنهای بینشان

مثال:

<?php

$message = '<a href="hamid">Salam</a> Doste Gerami<br><a href="ali">Bazam Salam</a>';
$message = preg_replace('#<a href="(?!test.com)(.*)</a>#i', 'LINK', $message);

echo $message;
?>
خروجی:

LINK در کد فوق تمام اطلاعات بین <a> اول تا </a> آخر از بین خواهند رفت.

دلیلش هم حریص بودن عملگر * است.

اما کد دوم این مشکل رو نخواهد داشت.

MMSHFE
چهارشنبه 13 اردیبهشت 1391, 12:37 عصر
شرمنده فکر کنم برعکس گفتین چون وجود اصلاحگر s (حروف کوچک) باعث میشه کارکترهای NewLine و... هم درنظر گرفته بشن. من کد رو تست کردم و دوتا لینک گذاشتم که اولی باید جایگزین میشد و دومی نه و کد کار کرد. درهرحال برای اطمینان بیشتر توصیه میکنم این کار رو انجام بدین:

$message = preg_replace('#<a href="(?!test.com)([^<]*)</a>#i', $lang->reglinks_text, $message);

Hamid.RDN
چهارشنبه 13 اردیبهشت 1391, 12:51 عصر
عملگر s باعث میشه که لینکهای چند سطری و یا تب داره هم شرکت کنند.

عملگر ([^<]*) هم همون جلوگیری از حریصانه بودن * هست. که من با (?*.) جایگزین کردم. اما مشکل اینجاست که کد شما حریصانگی رو در مورد عدم تطابق انجام میده نه تطابق.

این مثال رو ببینید


$message = '<a href="hamid"><b>Salam</b></a> Doste Gerami<br><a href="test.com">Bazam Salam</a>';
$message = preg_replace('#<a href="(?!test.com)([^<]*)</a>#i', 'LINK', $message);
echo $message;
کد شما این مورد رو حذف نمیکنه

MMSHFE
چهارشنبه 13 اردیبهشت 1391, 15:03 عصر
شرمنده من متوجه ? نشده بودم. فکر کردم منظورتون s هست. بله وجود ? برای تفکیک لینکهای متعدد درون یک سطر لازمه.

Hamid.RDN
چهارشنبه 13 اردیبهشت 1391, 15:31 عصر
خواهش می کنم. دشمنتون شرمنده باشه.
بهرحال پیش میاد.
موفق باشید