-
August 12th, 2017, 20:11
#1
این تابع چه بلایی سر رشته میاره؟
سلام بر دوستان و بزرگان انجمن
یک تابع دارم به شکل زیر:
کد PHP:
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;}
میخوام شما بگید به شکل مرحله به مرحله داره رو متنی که گرفته چه عملیاتی رو پیاده میکنه؟
تشکر
ویرایش توسط mehran-b : August 12th, 2017 در ساعت 20:13
-
-
August 12th, 2017 20:11
# ADS
-
August 12th, 2017, 21:34
#2
عضو انجمن
پاسخ : این تابع چه بلایی سر رشته میاره؟
htmlentities
PHP str_ireplace Function
preg_match in php tutorial
html_entity_decode
trim هم اسپیس ها رو از دو طرف استرینگ برمیداره
کلا کار مسخره ای کرده
از این استفاده کنید
کد PHP:
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 |
-
تعداد تشکر ها از starting به دلیل پست مفید
-
August 12th, 2017, 22:40
#3
عضو دائم
پاسخ : این تابع چه بلایی سر رشته میاره؟
باسلام، هدف متد شما پاک کردن تمام Html Entities ها است، Entity هم کارکتر های رزرو شده در html مثل > < & " و .. است، Entity ها به 2 صورت زیر قابل استفاده در کد هامون است :
شما اگر ورودی یک رشته : Toosi <salam> بدید در خط اول رشته تبدیل به Toosi <salam> خواهد شد، در خط بعدی دو تا Entity خودش مشخص کرده است که اگر موجود بود پاک کند (‌ و  ) در خط بعدی هرچه Entity Number و Entity Name پیدا کند پاک میکند، در خط بعدی تمامی Entity باقی مانده را به کارکتر خوانا تبدیل میکند (در کدی که گذاشتید لازم نیست چون با preg_replace که هست هیچ Entity باقی نخواهد ماند که Decode کند)، در خط بعدی اگر رشته حاوی چند خط باشد همه را به یک خط تبدیل خواهد کرد (newline ها را به white space تبدیل میکند)، در خط بعدی هم فاصله های دو طرف رشته را پاک خواهد کرد و خروجی Toosi salam خواهد شد.
ویرایش توسط T.Toosi : August 12th, 2017 در ساعت 22:43
-
تعداد تشکر ها ازT.Toosi به دلیل پست مفید
-
August 13th, 2017, 01:11
#4
پاسخ : این تابع چه بلایی سر رشته میاره؟

نوشته اصلی توسط
T.Toosi
باسلام، هدف متد شما پاک کردن تمام Html Entities ها است، Entity هم کارکتر های رزرو شده در html مثل > < & " و .. است، Entity ها به 2 صورت زیر قابل استفاده در کد هامون است :
شما اگر ورودی یک رشته : Toosi <salam> بدید در خط اول رشته تبدیل به Toosi <salam> خواهد شد، در خط بعدی دو تا Entity خودش مشخص کرده است که اگر موجود بود پاک کند (‌ و  ) در خط بعدی هرچه Entity Number و
Entity Name پیدا کند پاک میکند، در خط بعدی تمامی Entity باقی مانده را به کارکتر خوانا تبدیل میکند (در کدی که گذاشتید لازم نیست چون با preg_replace که هست هیچ Entity باقی نخواهد ماند که Decode کند)، در خط بعدی اگر رشته حاوی چند خط باشد همه را به یک خط تبدیل خواهد کرد (newline ها را به white space تبدیل میکند)، در خط بعدی هم فاصله های دو طرف رشته را پاک خواهد کرد و خروجی Toosi salam خواهد شد.
پس طبق فرمایش شما بعد از preg_replace تمامی چیزهایی که از html میمونه توی متن از بین میره و html_entity_decode توی کد بیهوده استفاده شده؟
مورد بعدی اینکه در htmlentities در پارامتر دوم از null استفاده شده. این به این معنی هست که از مقدار پیشفرض استفاده بشه؟
تشکر
-
-
August 13th, 2017, 01:43
#5
عضو دائم
پاسخ : این تابع چه بلایی سر رشته میاره؟

نوشته اصلی توسط
mehran-b
پس طبق فرمایش شما بعد از preg_replace تمامی چیزهایی که از html میمونه توی متن از بین میره و html_entity_decode توی کد بیهوده استفاده شده؟
مورد بعدی اینکه در htmlentities در پارامتر دوم از null استفاده شده. این به این معنی هست که از مقدار پیشفرض استفاده بشه؟
تشکر
این لاین ها بیهوده است :
کد:
$clear_text = str_ireplace([' ','‌'], [' ', ' '], $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
-
تعداد تشکر ها ازT.Toosi به دلیل پست مفید
-
August 13th, 2017, 01:45
#6
عضو انجمن
پاسخ : این تابع چه بلایی سر رشته میاره؟

نوشته اصلی توسط
mehran-b
پس طبق فرمایش شما بعد از preg_replace تمامی چیزهایی که از html میمونه توی متن از بین میره و html_entity_decode توی کد بیهوده استفاده شده؟
مورد بعدی اینکه در htmlentities در پارامتر دوم از null استفاده شده. این به این معنی هست که از مقدار پیشفرض استفاده بشه؟
تشکر
بله فانکشن زیر لازم نیست و الکی اجرا میشه(بود و نبودش سودی نداره)
کد PHP:
);
$clear_text = html_entity_decode($clear_text);
نال رو چون نمیخواسته از هیچ flags استفاده کنه و قصد ست کردن کارکتر ست داشته اورده که تابع اتربیوت هاشو بشانسه با اینکه نیازی هم نبود استفاده کنه
کد PHP:
htmlentities(string,flags,character-set,double_encode)
- - - Updated - - -

نوشته اصلی توسط
T.Toosi
این لاین ها بیهوده است :
کد:
$clear_text = str_ireplace([' ','‌'], [' ', ' '], $clear_text);
کد:
$clear_text = html_entity_decode($clear_text);
به دلیل اینکه لاین زیر تمام Entity ها را پاک میکند :
شاید برای مورد اولی هدفش پاک کردن فاصله ها بوده
چون در صورت عدم وجود در انتها فانکشن با رشته عبارت nbsp; رو همراه با رشته برمیگردوند
-
تعداد تشکر ها از starting به دلیل پست مفید
-
August 13th, 2017, 01:53
#7
پاسخ : این تابع چه بلایی سر رشته میاره؟
شاید برای مورد اولی هدفش پاک کردن فاصله ها بوده
چون در صورت عدم وجود در انتها فانکشن با رشته عبارت nbsp; رو همراه با رشته برمیگردوند
بله. نیم فاصله و فاصله رو تبدیل کرده به فاصله و بقیه Entity رو حذف کرده.
ولی من بارم نفهمیدم در htmlentities وقتی flags رو null گذاشته یعنی تابع بدون flags کار میکنه و اروری نمیده یا نه چون flag دیفالت یعنی ENT_COMPAT | ENT_HTML401 رو استفاده میکنه اروری نمیده؟
-
-
August 13th, 2017, 02:07
#8
عضو انجمن
پاسخ : این تابع چه بلایی سر رشته میاره؟

نوشته اصلی توسط
mehran-b
بله. نیم فاصله و فاصله رو تبدیل کرده به فاصله و بقیه Entity رو حذف کرده.
ولی من بارم نفهمیدم در htmlentities وقتی flags رو null گذاشته یعنی تابع بدون flags کار میکنه و اروری نمیده یا نه چون flag دیفالت یعنی ENT_COMPAT | ENT_HTML401 رو استفاده میکنه اروری نمیده؟
ببینید هر تابع ورودی ها رو براساس ترتیب خودش میگیره
ایشون میخواسته استرینگ رو بده و از کارکتر ست هم استفاده کنه پس یا باید اتربیوت دوم رو تال بزاره
پیشنهاد میدم از phpstorm بعنوان ادیتور در کد نویسی استفاده کنید
-
تعداد تشکر ها از starting به دلیل پست مفید
-
August 13th, 2017, 02:15
#9
پاسخ : این تابع چه بلایی سر رشته میاره؟

نوشته اصلی توسط
starting
ببینید هر تابع ورودی ها رو براساس ترتیب خودش میگیره
ایشون میخواسته استرینگ رو بده و از کارکتر ست هم استفاده کنه پس یا باید اتربیوت دوم رو تال بزاره
پیشنهاد میدم از phpstorm بعنوان ادیتور در کد نویسی استفاده کنید
بله در این حد متوجه هستم. ولی وقتی که بخوان یه آرگومان رو رد کنن جاش null نمیذارن معمولا مقدار دیفالت رو قرار میدن.
الان می میخوام بدون این کد
کد PHP:
htmlentities($str, null, 'UTF-8');
str ورودی رو با چه flag ای خروجی میده؟
تشکر بابت تامل
-
-
August 13th, 2017, 02:25
#10
عضو دائم
پاسخ : این تابع چه بلایی سر رشته میاره؟
شاید برای مورد اولی هدفش پاک کردن فاصله ها بوده
چون در صورت عدم وجود در انتها فانکشن با رشته عبارت
nbsp; رو همراه با رشته برمیگردوند
ورودی تابع رشته است بدون entity name، داخل تابع توسط متد htmlentities کارکتر هامون به entity تبدیل خواهد شد، اما اگر در ورودی تابع ارسال کنید به مشکل میخورد و nbsp; برگشت میدهد (به صورت خلاصه اگر ورودی تابع مستقیم بنویسیم خروجی nbsp; خواهد آمد)
نکته ی دیگری که هست در فلگ دیفالت (ENT_HTML401) این متد از کارکتر non breaking space یا همون پشتیبانی نمی کند، پس اگر ورودی تابع بالای ما non breaking space داشته باشد، متد htmlentities همون کارکتر فاصله را نمایش میدهد و نه و حتی ‌ هم پشتیبانی نمیکند (کلا 4 تا کارکتر فلگ دیفالت پشتیبانی میکند که در پایین لیست کردم) برای همین کلا این لاین اضافه و بدون کاربرد است مگر اینکه فلگ را عوض کنیم.
بله. نیم فاصله و فاصله رو تبدیل کرده به فاصله و بقیه Entity رو حذف کرده.
درست است، فاصله ها را تبدیل کرده است، اگر نباشد و چند جمله باشد بهم میچسبند.
ولی من بارم نفهمیدم در htmlentities وقتی flags رو null گذاشته یعنی تابع بدون flags کار میکنه و اروری نمیده یا نه چون flag دیفالت یعنی ENT_COMPAT | ENT_HTML401 رو استفاده میکنه اروری نمیده؟
این پارامتر اختیاری است، حالا اگر میخواهید ببینید اگر مقدار null بزاریم چه کارکتر هایی را این فلگ پشتیبانی میکند به صورت زیر عمل کنید : (null هم بزارید باز از ENT_HTML401 استفاده خواهد کرد)
کد PHP:
var_dump(get_html_translation_table(null));
خروجی :
کد:
array (size=4)
'"' => string '"' (length=6)
'&' => string '&' (length=5)
'<' => string '<' (length=4)
'>' => string '>' (length=4)
حالا از فلگ زیر استفاده کنید :
کد PHP:
var_dump(get_html_translation_table(ENT_HTML5));
خروجی :
کد:
array (size=252)
'"' => string '"' (length=6)
'&' => string '&' (length=5)
'<' => string '<' (length=4)
'>' => string '>' (length=4)
' ' => string ' ' (length=6)
'¡' => string '¡' (length=7)
'¢' => string '¢' (length=6)
'£' => string '£' (length=7)
'¤' => string '¤' (length=8)
'¥' => string '¥' (length=5)
'¦' => string '¦' (length=8)
'§' => string '§' (length=6)
'¨' => string '¨' (length=5)
'©' => string '©' (length=6)
'ª' => string 'ª' (length=6)
'«' => string '«' (length=7)
'¬' => string '¬' (length=5)
'' => string '' (length=5)
'®' => string '®' (length=5)
'¯' => string '¯' (length=6)
'°' => string '°' (length=5)
'±' => string '±' (length=8)
'²' => string '²' (length=6)
'³' => string '³' (length=6)
'´' => string '´' (length=7)
'µ' => string 'µ' (length=7)
'¶' => string '¶' (length=6)
'·' => string '·' (length=8)
'¸' => string '¸' (length=7)
'¹' => string '¹' (length=6)
'º' => string 'º' (length=6)
'»' => string '»' (length=7)
میبینید این فلگ 252 تا کارکتر را پشتیبانی و تبدیل میکند، پس اول ببینید رشته ورودی این تابع شما چه Handle ای نیاز دارد و فلگ مناسب با آن را انتخاب کنید.
ویرایش توسط T.Toosi : August 13th, 2017 در ساعت 03:05
-
تعداد تشکر ها ازT.Toosi به دلیل پست مفید