ورود

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : این تابع چه بلایی سر رشته میاره؟



mehran-b
August 12th, 2017, 20:11
سلام بر دوستان و بزرگان انجمن

یک تابع دارم به شکل زیر:



function clear_string($str) {
$clear_text = htmlentities($str, null, 'UTF-8');
$clear_text = str_ireplace([' ','‌'], [' ', ' '], $clear_text);
$clear_text = preg_replace('/&#?[a-z0-9]+;/i', '', $clear_text);
$clear_text = html_entity_decode($clear_text);
$clear_text = preg_replace('/\s+/', ' ', $clear_text);
$clear_text = trim($clear_text);
return $clear_text;}


میخوام شما بگید به شکل مرحله به مرحله داره رو متنی که گرفته چه عملیاتی رو پیاده میکنه؟

تشکر

starting
August 12th, 2017, 21:34
htmlentities
(http://jee.ir/5rvIe)PHP str_ireplace Function (http://jee.ir/ykBta)

preg_match in php tutorial
(http://jee.ir/3QUTu)
html_entity_decode
(http://jee.ir/EZ0Bt)
trim هم اسپیس ها رو از دو طرف استرینگ برمیداره

کلا کار مسخره ای کرده
از این استفاده کنید

function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
موارد زیر هم Entity های استفاده شده در تابع خودتون


Char
Dec
Hex
Entity
Name


 
8192
2000

EN QUAD



8193
2001

EM QUAD



8194
2002
 
EN SPACE



8195
2003
 
EM SPACE



8196
2004

THREE-PER-EM SPACE



8197
2005

FOUR-PER-EM SPACE



8198
2006

SIX-PER-EM SPACE



8199
2007

FIGURE SPACE



8200
2008

PUNCTUATION SPACE



8201
2009
 
THIN SPACE



8202
200A

HAIR SPACE



8203
200B

ZERO WIDTH SPACE



8204
200C
‌
ZERO WIDTH NON-JOINER



8205
200D
‍
ZERO WIDTH JOINER



8206
200E
‎
LEFT-TO-RIGHT MARK



8207
200F
‏
RIGHT-TO-LEFT MARK



8208
2010

HYPHEN



8209
2011

NON-BREAKING HYPHEN



8210
2012

FIGURE DASH



8211
2013
–
EN DASH



8212
2014
—
EM DASH



8213
2015

HORIZONTAL BAR



8214
2016

DOUBLE VERTICAL LINE



8215
2017

DOUBLE LOW LINE



8216
2018
‘
LEFT SINGLE QUOTATION MARK



8217
2019
’
RIGHT SINGLE QUOTATION MARK



8218
201A
‚
SINGLE LOW-9 QUOTATION MARK



8219
201B

SINGLE HIGH-REVERSED-9 QUOTATION MARK



8220
201C
“
LEFT DOUBLE QUOTATION MARK



8221
201D
”
RIGHT DOUBLE QUOTATION MARK



8222
201E
„
DOUBLE LOW-9 QUOTATION MARK



8223
201F

DOUBLE HIGH-REVERSED-9 QUOTATION MARK



8224
2020
†
DAGGER



8225
2021
‡
DOUBLE DAGGER



8226
2022
•
BULLET



8227
2023

TRIANGULAR BULLET



8228
2024

ONE DOT LEADER



8229
2025

TWO DOT LEADER



8230
2026
…
HORIZONTAL ELLIPSIS



8231
2027

HYPHENATION POINT



8232
2028

LINE SEPARATOR



8233
2029

PARAGRAPH SEPARATOR



8234
202A

LEFT-TO-RIGHT EMBEDDING



8235
202B

RIGHT-TO-LEFT EMBEDDING



8236
202C

POP DIRECTIONAL FORMATTING



8237
202D

LEFT-TO-RIGHT OVERRIDE



8238
202E

RIGHT-TO-LEFT OVERRIDE



8239
202F

NARROW NON-BREAK SPACE



8240
2030
‰
PER MILLE SIGN



8241
2031

PER TEN THOUSAND SIGN



8242
2032
′
PRIME



8243
2033
″
DOUBLE PRIME



8244
2034

TRIPLE PRIME



8245
2035

REVERSED PRIME



8246
2036

REVERSED DOUBLE PRIME



8247
2037

REVERSED TRIPLE PRIME



8248
2038

CARET



8249
2039
‹
SINGLE LEFT-POINTING ANGLE QUOTATION MARK



8250
203A
›
SINGLE RIGHT-POINTING ANGLE QUOTATION MARK



8251
203B

REFERENCE MARK



8252
203C

DOUBLE EXCLAMATION MARK



8253
203D

INTERROBANG



8254
203E
‾
OVERLINE



8255
203F

UNDERTIE



8256
2040

CHARACTER TIE



8257
2041

CARET INSERTION POINT



8258
2042

ASTERISM



8259
2043

HYPHEN BULLET



8260
2044
⁄
FRACTION SLASH



8261
2045

LEFT SQUARE BRACKET WITH QUILL



8262
2046

RIGHT SQUARE BRACKET WITH QUILL



8263
2047

DOUBLE QUESTION MARK



8264
2048

QUESTION EXCLAMATION MARK



8265
2049

EXCLAMATION QUESTION MARK



8266
204A

TIRONIAN SIGN ET



8267
204B

REVERSED PILCROW SIGN



8268
204C

BLACK LEFTWARDS BULLET



8269
204D

BLACK RIGHTWARDS BULLET



8270
204E

LOW ASTERISK



8271
204F

REVERSED SEMICOLON



8272
2050

CLOSE UP



8273
2051

TWO ASTERISKS ALIGNED VERTICALLY



8274
2052

COMMERCIAL MINUS SIGN



8275
2053

SWUNG DASH



8276
2054

INVERTED UNDERTIE



8277
2055

FLOWER PUNCTUATION MARK



8278
2056

THREE DOT PUNCTUATION



8279
2057

QUADRUPLE PRIME



8280
2058

FOUR DOT PUNCTUATION



8281
2059

FIVE DOT PUNCTUATION



8282
205A

TWO DOT PUNCTUATION



8283
205B

FOUR DOT MARK



8284
205C

DOTTED CROSS



8285
205D

TRICOLON



8286
205E

VERTICAL FOUR DOTS



8287
205F

MEDIUM MATHEMATICAL SPACE



8288
2060

WORD JOINER



8289
2061

FUNCTION APPLICATION



8290
2062

INVISIBLE TIMES



8291
2063

INVISIBLE SEPARATOR



8292
2064

INVISIBLE PLUS



8294
2066

LEFT-TO-RIGHT ISOLATE



8295
2067

RIGHT-TO-LEFT ISOLATE



8296
2068

FIRST STRONG ISOLATE



8297
2069

POP DIRECTIONAL ISOLATE



8298
206A

INHIBIT SYMMETRIC SWAPPING



8299
206B

ACTIVATE SYMMETRIC SWAPPING



8300
206C

INHIBIT ARABIC FORM SHAPING



8301
206D

ACTIVATE ARABIC FORM SHAPING



8302
206E

NATIONAL DIGIT SHAPES



8303
206F

NOMINAL DIGIT SHAPES

T.Toosi
August 12th, 2017, 22:40
باسلام، هدف متد شما پاک کردن تمام Html Entities ها است، Entity هم کارکتر های رزرو شده در html مثل > < & " و .. است، Entity ها به 2 صورت زیر قابل استفاده در کد هامون است :


&entity_name;


&#entity_number;

شما اگر ورودی یک رشته : Toosi <salam> بدید در خط اول رشته تبدیل به Toosi &lt;salam&gt; خواهد شد، در خط بعدی دو تا Entity خودش مشخص کرده است که اگر موجود بود پاک کند (&zwnj; و &nbsp) در خط بعدی هرچه Entity Number و Entity Name پیدا کند پاک میکند، در خط بعدی تمامی Entity باقی مانده را به کارکتر خوانا تبدیل میکند (در کدی که گذاشتید لازم نیست چون با preg_replace که هست هیچ Entity باقی نخواهد ماند که Decode کند)، در خط بعدی اگر رشته حاوی چند خط باشد همه را به یک خط تبدیل خواهد کرد (newline ها را به white space تبدیل میکند)، در خط بعدی هم فاصله های دو طرف رشته را پاک خواهد کرد و خروجی Toosi salam خواهد شد.

mehran-b
August 13th, 2017, 01:11
باسلام، هدف متد شما پاک کردن تمام Html Entities ها است، Entity هم کارکتر های رزرو شده در html مثل > < & " و .. است، Entity ها به 2 صورت زیر قابل استفاده در کد هامون است :


&entity_name;


&#entity_number;

شما اگر ورودی یک رشته : Toosi <salam> بدید در خط اول رشته تبدیل به Toosi &lt;salam&gt; خواهد شد، در خط بعدی دو تا Entity خودش مشخص کرده است که اگر موجود بود پاک کند (&zwnj; و &nbsp) در خط بعدی هرچه Entity Number و Entity Name پیدا کند پاک میکند، در خط بعدی تمامی Entity باقی مانده را به کارکتر خوانا تبدیل میکند (در کدی که گذاشتید لازم نیست چون با preg_replace که هست هیچ Entity باقی نخواهد ماند که Decode کند)، در خط بعدی اگر رشته حاوی چند خط باشد همه را به یک خط تبدیل خواهد کرد (newline ها را به white space تبدیل میکند)، در خط بعدی هم فاصله های دو طرف رشته را پاک خواهد کرد و خروجی Toosi salam خواهد شد.

پس طبق فرمایش شما بعد از preg_replace تمامی چیزهایی که از html میمونه توی متن از بین میره و html_entity_decode توی کد بیهوده استفاده شده؟

مورد بعدی اینکه در htmlentities در پارامتر دوم از null استفاده شده. این به این معنی هست که از مقدار پیشفرض استفاده بشه؟

تشکر

T.Toosi
August 13th, 2017, 01:43
پس طبق فرمایش شما بعد از preg_replace تمامی چیزهایی که از html میمونه توی متن از بین میره و html_entity_decode توی کد بیهوده استفاده شده؟

مورد بعدی اینکه در htmlentities در پارامتر دوم از null استفاده شده. این به این معنی هست که از مقدار پیشفرض استفاده بشه؟

تشکر

این لاین ها بیهوده است :


$clear_text = str_ireplace(['&nbsp;','&zwnj;'], [' ', ' '], $clear_text);


$clear_text = html_entity_decode($clear_text);

به دلیل اینکه لاین زیر تمام Entity ها را پاک میکند :


$clear_text = preg_replace('/&#?[a-z0-9]+;/i', '', $clear_text);


پارامتر دوم htmlentities هم flags هست، برای مدیریت الگوریتم کدگذاری نامعتبر و کوتیشن ها استفاده میشود.


http://php.net/manual/en/function.htmlentities.php

starting
August 13th, 2017, 01:45
پس طبق فرمایش شما بعد از preg_replace تمامی چیزهایی که از html میمونه توی متن از بین میره و html_entity_decode توی کد بیهوده استفاده شده؟

مورد بعدی اینکه در htmlentities در پارامتر دوم از null استفاده شده. این به این معنی هست که از مقدار پیشفرض استفاده بشه؟

تشکر
بله فانکشن زیر لازم نیست و الکی اجرا میشه(بود و نبودش سودی نداره)

);
$clear_text = html_entity_decode($clear_text);
نال رو چون نمیخواسته از هیچ flags استفاده کنه و قصد ست کردن کارکتر ست داشته اورده که تابع اتربیوت هاشو بشانسه با اینکه نیازی هم نبود استفاده کنه

htmlentities(string,flags,character-set,double_encode)


- - - Updated - - -


این لاین ها بیهوده است :


$clear_text = str_ireplace(['&nbsp;','&zwnj;'], [' ', ' '], $clear_text);


$clear_text = html_entity_decode($clear_text);

به دلیل اینکه لاین زیر تمام Entity ها را پاک میکند :


شاید برای مورد اولی هدفش پاک کردن فاصله ها بوده
چون در صورت عدم وجود در انتها فانکشن با رشته عبارت nbsp; رو همراه با رشته برمیگردوند

mehran-b
August 13th, 2017, 01:53
شاید برای مورد اولی هدفش پاک کردن فاصله ها بوده
چون در صورت عدم وجود در انتها فانکشن با رشته عبارت nbsp; رو همراه با رشته برمیگردوند

بله. نیم فاصله و فاصله رو تبدیل کرده به فاصله و بقیه Entity رو حذف کرده.

ولی من بارم نفهمیدم در htmlentities وقتی flags رو null گذاشته یعنی تابع بدون flags کار میکنه و اروری نمیده یا نه چون flag دیفالت یعنی ENT_COMPAT | ENT_HTML401 رو استفاده میکنه اروری نمیده؟

starting
August 13th, 2017, 02:07
بله. نیم فاصله و فاصله رو تبدیل کرده به فاصله و بقیه Entity رو حذف کرده.

ولی من بارم نفهمیدم در htmlentities وقتی flags رو null گذاشته یعنی تابع بدون flags کار میکنه و اروری نمیده یا نه چون flag دیفالت یعنی ENT_COMPAT | ENT_HTML401 رو استفاده میکنه اروری نمیده؟

ببینید هر تابع ورودی ها رو براساس ترتیب خودش میگیره
ایشون میخواسته استرینگ رو بده و از کارکتر ست هم استفاده کنه پس یا باید اتربیوت دوم رو تال بزاره

پیشنهاد میدم از phpstorm بعنوان ادیتور در کد نویسی استفاده کنید

mehran-b
August 13th, 2017, 02:15
ببینید هر تابع ورودی ها رو براساس ترتیب خودش میگیره
ایشون میخواسته استرینگ رو بده و از کارکتر ست هم استفاده کنه پس یا باید اتربیوت دوم رو تال بزاره

پیشنهاد میدم از phpstorm بعنوان ادیتور در کد نویسی استفاده کنید

بله در این حد متوجه هستم. ولی وقتی که بخوان یه آرگومان رو رد کنن جاش null نمیذارن معمولا مقدار دیفالت رو قرار میدن.

الان می میخوام بدون این کد



htmlentities($str, null, 'UTF-8');


str ورودی رو با چه flag ای خروجی میده؟

تشکر بابت تامل

T.Toosi
August 13th, 2017, 02:25
شاید برای مورد اولی هدفش پاک کردن فاصله ها بوده
چون در صورت عدم وجود در انتها فانکشن با رشته عبارت nbsp; رو همراه با رشته برمیگردوند

ورودی تابع رشته است بدون entity name، داخل تابع توسط متد htmlentities کارکتر هامون به entity تبدیل خواهد شد، اما اگر در ورودی تابع &nbsp; ارسال کنید به مشکل میخورد و nbsp; برگشت میدهد (به صورت خلاصه اگر ورودی تابع مستقیم بنویسیم &nbsp; خروجی nbsp; خواهد آمد)

نکته ی دیگری که هست در فلگ دیفالت (ENT_HTML401) این متد از کارکتر non breaking space یا همون &nbsp; پشتیبانی نمی کند، پس اگر ورودی تابع بالای ما non breaking space داشته باشد، متد htmlentities همون کارکتر فاصله را نمایش میدهد و نه &nbsp; و حتی &zwnj; هم پشتیبانی نمیکند (کلا 4 تا کارکتر فلگ دیفالت پشتیبانی میکند که در پایین لیست کردم) برای همین کلا این لاین اضافه و بدون کاربرد است مگر اینکه فلگ را عوض کنیم.


بله. نیم فاصله و فاصله رو تبدیل کرده به فاصله و بقیه Entity رو حذف کرده.

درست است، فاصله ها را تبدیل کرده است، اگر نباشد و چند جمله باشد بهم میچسبند.


ولی من بارم نفهمیدم در htmlentities وقتی flags رو null گذاشته یعنی تابع بدون flags کار میکنه و اروری نمیده یا نه چون flag دیفالت یعنی ENT_COMPAT | ENT_HTML401 رو استفاده میکنه اروری نمیده؟

این پارامتر اختیاری است، حالا اگر میخواهید ببینید اگر مقدار null بزاریم چه کارکتر هایی را این فلگ پشتیبانی میکند به صورت زیر عمل کنید : (null هم بزارید باز از ENT_HTML401 استفاده خواهد کرد)


var_dump(get_html_translation_table(null));

خروجی :


array (size=4)
'"' => string '&quot;' (length=6)
'&' => string '&amp;' (length=5)
'<' => string '&lt;' (length=4)
'>' => string '&gt;' (length=4)

حالا از فلگ زیر استفاده کنید :


var_dump(get_html_translation_table(ENT_HTML5));

خروجی :


array (size=252)
'"' => string '&quot;' (length=6)
'&' => string '&amp;' (length=5)
'<' => string '&lt;' (length=4)
'>' => string '&gt;' (length=4)
' ' => string '&nbsp;' (length=6)
'¡' => string '&iexcl;' (length=7)
'¢' => string '&cent;' (length=6)
'£' => string '&pound;' (length=7)
'¤' => string '&curren;' (length=8)
'¥' => string '&yen;' (length=5)
'¦' => string '&brvbar;' (length=8)
'§' => string '&sect;' (length=6)
'¨' => string '&uml;' (length=5)
'©' => string '&copy;' (length=6)
'ª' => string '&ordf;' (length=6)
'«' => string '&laquo;' (length=7)
'¬' => string '&not;' (length=5)
'­' => string '­' (length=5)
'®' => string '&reg;' (length=5)
'¯' => string '&macr;' (length=6)
'°' => string '&deg;' (length=5)
'±' => string '&plusmn;' (length=8)
'²' => string '&sup2;' (length=6)
'³' => string '&sup3;' (length=6)
'´' => string '&acute;' (length=7)
'µ' => string '&micro;' (length=7)
'¶' => string '&para;' (length=6)
'·' => string '&middot;' (length=8)
'¸' => string '&cedil;' (length=7)
'¹' => string '&sup1;' (length=6)
'º' => string '&ordm;' (length=6)
'»' => string '&raquo;' (length=7)

میبینید این فلگ 252 تا کارکتر را پشتیبانی و تبدیل میکند، پس اول ببینید رشته ورودی این تابع شما چه Handle ای نیاز دارد و فلگ مناسب با آن را انتخاب کنید.