PDA

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



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 ای نیاز دارد و فلگ مناسب با آن را انتخاب کنید.