मुझे लगता है कि मुझे चार्ट को हटाने की आवश्यकता है 0-31 और 127,
क्या इसे कुशलतापूर्वक करने के लिए कोई फ़ंक्शन या कोड का टुकड़ा है।
मुझे लगता है कि मुझे चार्ट को हटाने की आवश्यकता है 0-31 और 127,
क्या इसे कुशलतापूर्वक करने के लिए कोई फ़ंक्शन या कोड का टुकड़ा है।
जवाबों:
यदि आपकी तारदिस बस 1963 में उतरी, और आप बस 7 बिट प्रिंट करने योग्य ASCII चार्ट चाहते हैं, तो आप 0-31 और 127-255 से सब कुछ चीर सकते हैं:
$string = preg_replace('/[\x00-\x1F\x7F-\xFF]/', '', $string);
यह 0-31, 127-255 में कुछ भी मेल खाता है और इसे हटा देता है।
आप हॉट टब टाइम मशीन में गिर गए, और आप अस्सी के दशक में वापस आ गए। यदि आपको 8 बिट ASCII का कुछ रूप मिला है, तो आप वर्णों को 128-255 की सीमा में रखना चाह सकते हैं। एक आसान समायोजन - बस 0-31 और 127 की तलाश करें
$string = preg_replace('/[\x00-\x1F\x7F]/', '', $string);
आह, 21 वीं सदी में आपका स्वागत है। यदि आपके पास UTF-8 एन्कोडेड स्ट्रिंग है, तो /u
संशोधक को रेगेक्स पर उपयोग किया जा सकता है
$string = preg_replace('/[\x00-\x1F\x7F]/u', '', $string);
यह सिर्फ 0-31 और 127 को हटाता है। यह ASCII और UTF-8 में काम करता है क्योंकि दोनों एक ही नियंत्रण सेट सीमा (जैसा कि नीचे mgutt द्वारा दिया गया है) साझा करते हैं। कड़े शब्दों में, यह /u
संशोधक के बिना काम करेगा । लेकिन यह जीवन को आसान बनाता है यदि आप अन्य वर्णों को हटाना चाहते हैं ...
यदि आप यूनिकोड के साथ काम कर रहे हैं, तो हैं संभावित रूप से कई गैर-मुद्रण तत्व हैं , लेकिन आइए एक सरल पर विचार करें: NO-BREAK SPACE (U + 00A0)
UTF-8 स्ट्रिंग में, इसे एन्कोड किया जाएगा 0xC2A0
। आप उस विशिष्ट अनुक्रम को देख सकते हैं और हटा सकते हैं, लेकिन /u
स्थान में संशोधक के साथ , आप बस \xA0
वर्ण वर्ग में जोड़ सकते हैं :
$string = preg_replace('/[\x00-\x1F\x7F\xA0]/u', '', $string);
preg_replace बहुत कुशल है, लेकिन यदि आप इस ऑपरेशन को बहुत अधिक कर रहे हैं, तो आप अपने द्वारा हटाए जाने वाले वर्णों की एक सरणी का निर्माण कर सकते हैं, और str_replace का उपयोग नीचे दिए गए mgutt द्वारा किया जा सकता है, जैसे।
//build an array we can re-use across several operations
$badchar=array(
// control characters
chr(0), chr(1), chr(2), chr(3), chr(4), chr(5), chr(6), chr(7), chr(8), chr(9), chr(10),
chr(11), chr(12), chr(13), chr(14), chr(15), chr(16), chr(17), chr(18), chr(19), chr(20),
chr(21), chr(22), chr(23), chr(24), chr(25), chr(26), chr(27), chr(28), chr(29), chr(30),
chr(31),
// non-printing characters
chr(127)
);
//replace the unwanted chars
$str2 = str_replace($badchar, '', $str);
सहज रूप से, ऐसा लगता है कि यह तेजी से होगा, लेकिन यह हमेशा मामला नहीं होता है, आपको निश्चित रूप से यह देखना चाहिए कि क्या यह आपको कुछ भी बचाता है। मैंने यादृच्छिक डेटा के साथ कई स्ट्रिंग स्ट्रिंग लंबाई में कुछ बेंचमार्क किए, और यह पैटर्न php 7.0.12 का उपयोग करके उभरा
2 chars str_replace 5.3439ms preg_replace 2.9919ms preg_replace is 44.01% faster
4 chars str_replace 6.0701ms preg_replace 1.4119ms preg_replace is 76.74% faster
8 chars str_replace 5.8119ms preg_replace 2.0721ms preg_replace is 64.35% faster
16 chars str_replace 6.0401ms preg_replace 2.1980ms preg_replace is 63.61% faster
32 chars str_replace 6.0320ms preg_replace 2.6770ms preg_replace is 55.62% faster
64 chars str_replace 7.4198ms preg_replace 4.4160ms preg_replace is 40.48% faster
128 chars str_replace 12.7239ms preg_replace 7.5412ms preg_replace is 40.73% faster
256 chars str_replace 19.8820ms preg_replace 17.1330ms preg_replace is 13.83% faster
512 chars str_replace 34.3399ms preg_replace 34.0221ms preg_replace is 0.93% faster
1024 chars str_replace 57.1141ms preg_replace 67.0300ms str_replace is 14.79% faster
2048 chars str_replace 94.7111ms preg_replace 123.3189ms str_replace is 23.20% faster
4096 chars str_replace 227.7029ms preg_replace 258.3771ms str_replace is 11.87% faster
8192 chars str_replace 506.3410ms preg_replace 555.6269ms str_replace is 8.87% faster
16384 chars str_replace 1116.8811ms preg_replace 1098.0589ms preg_replace is 1.69% faster
32768 chars str_replace 2299.3128ms preg_replace 2222.8632ms preg_replace is 3.32% faster
10000 पुनरावृत्तियों के लिए समय स्वयं हैं, लेकिन जो अधिक दिलचस्प है वह सापेक्ष अंतर है। 512 चरस तक, मैं प्रीग_रेप्ले को हमेशा जीतता हुआ देख रहा था। 1-8kb रेंज में, str_replace में मामूली बढ़त थी।
मुझे लगा कि यह दिलचस्प परिणाम है, इसलिए इसे यहां शामिल किया गया है। महत्वपूर्ण बात यह है कि इस परिणाम को न लें और इसका उपयोग यह तय करने के लिए करें कि किस पद्धति का उपयोग करना है, लेकिन अपने स्वयं के डेटा के खिलाफ बेंचमार्क करना और फिर निर्णय लेना।
यहां कई अन्य उत्तर यूनिकोड वर्ण (जैसे öäüȝîûηйȝîûηы ე ⠛। மி) को ध्यान में नहीं रखते हैं। इस मामले में आप निम्नलिखित का उपयोग कर सकते हैं:
$string = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]/u', '', $string);
श्रेणी में वर्णों का एक अजीब वर्ग है (वर्णों \x80-\x9F
के 7-बिट ASCII श्रेणी के ऊपर) जो तकनीकी रूप से नियंत्रण वर्ण हैं, लेकिन समय के साथ मुद्रण योग्य वर्णों का दुरुपयोग किया गया है। यदि आपको इनसे कोई समस्या नहीं है, तो आप इसका उपयोग कर सकते हैं:
$string = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/u', '', $string);
यदि आप स्ट्रिप लाइन फीड्स, कैरिज रिटर्न, टैब्स, नॉन-ब्रेकिंग स्पेस और सॉफ्ट-हाइफ़न भी प्राप्त करना चाहते हैं, तो आप निम्न कार्य कर सकते हैं:
$string = preg_replace('/[\x00-\x1F\x7F-\xA0\xAD]/u', '', $string);
ध्यान दें कि आपको चाहिए उपरोक्त उदाहरणों के लिए एकल उद्धरणों का उपयोग ।
यदि आप मूल मुद्रण योग्य ASCII वर्णों को छोड़कर सब कुछ छीनना चाहते हैं (ऊपर दिए गए सभी उदाहरण वर्णों को छीन लिया जाएगा)
$string = preg_replace( '/[^[:print:]]/', '',$string);
संदर्भ के लिए देखें http://www.fileformat.info/info/charset/UTF-8/list.htm
'/[\x00-\x1F\x80-\xC0]/u'
उन्हें बरकरार रखता है; लेकिन यह भी विभाजन (F7) और गुणा (D7) संकेत है।
\x7F-\x9F
?
PHP 5.2 से शुरू होने पर, हमारे पास filter_var तक पहुंच भी है, जिसे मैंने किसी भी विचार का उल्लेख नहीं देखा है, मैं इसे वहां फेंक दूंगा। गैर-मुद्रण योग्य वर्णों को हटाने के लिए फ़िल्टर_वर का उपयोग करने के लिए <32 और> 127, आप कर सकते हैं:
32 से नीचे ASCII वर्ण फ़िल्टर करें
$string = filter_var($input, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW);
फ़िल्टर ASCII वर्ण 127 से ऊपर
$string = filter_var($input, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_HIGH);
दोनों पट्टी:
$string = filter_var($input, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW|FILTER_FLAG_STRIP_HIGH);
उच्चतर स्ट्रिपिंग करते समय आप कम अक्षरों (न्यूलाइन, टैब आदि) को भी एनकोड कर सकते हैं:
$string = filter_var($input, FILTER_UNSAFE_RAW, FILTER_FLAG_ENCODE_LOW|FILTER_FLAG_STRIP_HIGH);
HTML को अलग करने के लिए भी विकल्प हैं, ई-मेल और URL को सैनिटाइज़ करना, इत्यादि।, सैनिटाइजेशन के लिए बहुत सारे विकल्प (स्ट्रिप आउट डेटा) और यहां तक कि मान्यता (चुपचाप अलग करने के बजाय वैध नहीं होने पर वापस लौटें)।
स्वच्छता: http://php.net/manual/en/filter.filters.sanitize.php
मान्यता: http://php.net/manual/en/filter.filters.validate.php
हालाँकि, अभी भी समस्या है, कि FILTER_FLAG_STRIP_LOW नई लाइन और कैरिज रिटर्न को छीन लेगा, जो कि एक textarea के लिए पूरी तरह से मान्य वर्ण हैं ... इसलिए रेगेक्स के कुछ उत्तर, मुझे लगता है, इस समय की समीक्षा के बाद भी आवश्यक हैं, जैसे धागा, मैं textareas के लिए यह करने की योजना:
$string = preg_replace( '/[^[:print:]\r\n]/', '',$input);
यह संख्यात्मक रेंज द्वारा छीन ली गई कई संख्याओं से अधिक पठनीय लगता है।
आप वर्ण वर्गों का उपयोग कर सकते हैं
/[[:cntrl:]]+/
यह सरल है:
$ string = preg_replace ('/ [[[: cntrl:]] /', '', $ string);
समाधान के सभी आंशिक रूप से काम करते हैं, और नीचे भी शायद सभी मामलों को कवर नहीं करते हैं। मेरा मुद्दा utf8 mysql तालिका में एक स्ट्रिंग डालने की कोशिश में था। स्ट्रिंग (और उसके बाइट्स) सभी utf8 के अनुरूप थे, लेकिन कई बुरे क्रम थे। मुझे लगता है कि उनमें से ज्यादातर नियंत्रण या स्वरूपण थे।
function clean_string($string) {
$s = trim($string);
$s = iconv("UTF-8", "UTF-8//IGNORE", $s); // drop all non utf-8 characters
// this is some bad utf-8 byte sequence that makes mysql complain - control and formatting i think
$s = preg_replace('/(?>[\x00-\x1F]|\xC2[\x80-\x9F]|\xE2[\x80-\x8F]{2}|\xE2\x80[\xA4-\xA8]|\xE2\x81[\x9F-\xAF])/', ' ', $s);
$s = preg_replace('/\s+/', ' ', $s); // reduce all multiple whitespace to a single space
return $s;
}
समस्या को और अधिक बढ़ा देने के लिए तालिका बनाम सर्वर बनाम कनेक्शन बनाम सामग्री का प्रतिपादन, जैसा कि यहां थोड़ा बताया गया है
$s = preg_replace('/(\xF0\x9F[\x00-\xFF][\x00-\xFF])/', ' ', $s);
क्योंकि सभी इमोजी पात्रों को मैस्कल गड़बड़ कर रहे थे
आप उन पात्रों के अलावा सब कुछ हटाने के लिए एक नियमित एक्सप्रेस का उपयोग कर सकते हैं जिन्हें आप रखना चाहते हैं:
$string=preg_replace('/[^A-Za-z0-9 _\-\+\&]/','',$string);
जो कुछ नहीं है (^) अक्षर AZ या az, संख्या 0-9, स्थान, अंडरस्कोर, हाइपेन, प्लस और एम्परसेंड - जो कुछ भी नहीं है (यानी इसे हटा दें) को प्रतिस्थापित करता है।
preg_replace('/(?!\n)[\p{Cc}]/', '', $response);
इससे सभी नियंत्रण वर्ण ( http://uk.php.net/manual/en/regexp.reference.unicode.php ) \n
नए वर्णों को छोड़ देंगे । मेरे अनुभव से, नियंत्रण वर्ण वे हैं जो अक्सर मुद्रण मुद्दों का कारण बनते हैं।
/u
UTF-8 वर्णों के लिए जोड़ा । क्या आप बता सकते हैं कि पहला भाग (?!\n)
क्या करता है?
इनपुट स्ट्रिंग से सभी गैर-एएससीआईआई पात्रों को छीनने के लिए
$result = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $string);
यह कोड हेक्स श्रेणी 0-31 और 128-255 में किसी भी वर्ण को हटाता है, जिसके परिणामस्वरूप स्ट्रिंग में केवल हेक्स वर्ण 32-127 है, जिसे मैं इस उदाहरण में $ परिणाम कहता हूं।
@PaulDixon का जवाब है पूरी तरह से गलत है क्योंकि यह, प्रिंट करने योग्य निकालता है विस्तारित ASCII वर्ण 128-255!आंशिक रूप से ठीक किया गया है। मुझे नहीं पता कि वह अभी भी 127 चट 7 बी-बिट एएससीआईआई सेट से 128-255 को हटाना चाहता है क्योंकि इसमें विस्तारित एएससीआईआई अक्षर नहीं है।
लेकिन आखिरकार यह महत्वपूर्ण था कि 128-255 को डिलीट न करें क्योंकि उदाहरण के लिए chr(128)
( \x80
) 8-बिट ASCII में यूरो साइन है और विंडोज में कई UTF-8 फोंट एक यूरो साइन और एंड्रॉइड को मेरे स्वयं के परीक्षण के बारे में प्रदर्शित करते हैं ।
और यदि आप एक UTF-8 स्ट्रिंग (शायद एक मल्टी-बाइट UTF-8 वर्ण के शुरुआती बाइट्स) से ASCII वर्ण 128-255 निकालते हैं तो यह कई UTF-8 वर्णों को मार देगा। तो ऐसा मत करो! वे वर्तमान में उपयोग की गई सभी फ़ाइल सिस्टम में पूरी तरह से कानूनी पात्र हैं। एकमात्र आरक्षित सीमा 0-31 है ।
इसके बजाय गैर-मुद्रण योग्य वर्णों को हटाने के लिए इसका उपयोग करें 0-31 और 127:
$string = preg_replace('/[\x00-\x1F\x7F]/', '', $string);
यह ASCII और UTF-8 में काम करता है क्योंकि दोनों एक ही नियंत्रण सेट सीमा को साझा करते हैं ।
सबसे तेजी से नियमित अभिव्यक्ति का उपयोग किए बिना slower¹ विकल्प:
$string = str_replace(array(
// control characters
chr(0), chr(1), chr(2), chr(3), chr(4), chr(5), chr(6), chr(7), chr(8), chr(9), chr(10),
chr(11), chr(12), chr(13), chr(14), chr(15), chr(16), chr(17), chr(18), chr(19), chr(20),
chr(21), chr(22), chr(23), chr(24), chr(25), chr(26), chr(27), chr(28), chr(29), chr(30),
chr(31),
// non-printing characters
chr(127)
), '', $string);
यदि आप सभी व्हाट्सएप पात्रों को रखना चाहते हैं \t
, \n
और \r
, तो इस सूची से हटा दें chr(9)
, chr(10)
और chr(13)
। नोट: सामान्य व्हाट्सएप chr(32)
इसलिए है कि यह परिणाम में रहता है। अपने आप को तय करें कि क्या आप गैर-ब्रेकिंग स्पेस को हटाना चाहते हैं chr(160)
क्योंकि यह समस्याएं पैदा कर सकता है।
¹ @PaulDixon द्वारा परीक्षण किया गया और स्वयं द्वारा सत्यापित किया गया।
अंकित anwser सही है, लेकिन यह चरित्र 127 (DEL) को याद करता है जो एक गैर-मुद्रण योग्य चरित्र भी है
मेरा जवाब होगा
$string = preg_replace('/[\x00-\x1F\x7f-\xFF]/', '', $string);
"सीडिवैड" ने स्वीडिश वर्णों के लगातार परिणाम के साथ मेरे लिए इस मुद्दे को हल किया "।
$text = preg_replace( '/[^\p{L}\s]/u', '', $text );
धन्यवाद!
किसी के लिए जो अभी भी गैर-मुद्रण योग्य वर्णों को हटाने के बिना ऐसा करने के लिए देख रहा है, बल्कि उनसे बचकर, मैंने इसे मदद करने के लिए बनाया है। इसे सुधारने के लिए स्वतंत्र महसूस करें! अक्षर \\ x [A-F0-9] [A-F0-9] से बच जाते हैं।
ऐसे करें कॉल:
$escaped = EscapeNonASCII($string);
$unescaped = UnescapeNonASCII($string);
<?php
function EscapeNonASCII($string) //Convert string to hex, replace non-printable chars with escaped hex
{
$hexbytes = strtoupper(bin2hex($string));
$i = 0;
while ($i < strlen($hexbytes))
{
$hexpair = substr($hexbytes, $i, 2);
$decimal = hexdec($hexpair);
if ($decimal < 32 || $decimal > 126)
{
$top = substr($hexbytes, 0, $i);
$escaped = EscapeHex($hexpair);
$bottom = substr($hexbytes, $i + 2);
$hexbytes = $top . $escaped . $bottom;
$i += 8;
}
$i += 2;
}
$string = hex2bin($hexbytes);
return $string;
}
function EscapeHex($string) //Helper function for EscapeNonASCII()
{
$x = "5C5C78"; //\x
$topnibble = bin2hex($string[0]); //Convert top nibble to hex
$bottomnibble = bin2hex($string[1]); //Convert bottom nibble to hex
$escaped = $x . $topnibble . $bottomnibble; //Concatenate escape sequence "\x" with top and bottom nibble
return $escaped;
}
function UnescapeNonASCII($string) //Convert string to hex, replace escaped hex with actual hex.
{
$stringtohex = bin2hex($string);
$stringtohex = preg_replace_callback('/5c5c78([a-fA-F0-9]{4})/', function ($m) {
return hex2bin($m[1]);
}, $stringtohex);
return hex2bin(strtoupper($stringtohex));
}
?>
मैंने https://github.com/neitanod/forceutf8 का उपयोग करके UTF8 के लिए समस्या हल की
use ForceUTF8\Encoding;
$string = Encoding::fixUTF8($string);
यूनिकोड के लिए चयनित उत्तर में regex विफल: 0x1d (php 7.4 के साथ)
एक तरकीब:
<?php
$ct = 'différents'."\r\n test";
// fail for Unicode: 0x1d
$ct = preg_replace('/[\x00-\x1F\x7F]$/u', '',$ct);
// work for Unicode: 0x1d
$ct = preg_replace( '/[^\P{C}]+/u', "", $ct);
// work for Unicode: 0x1d and allow line break
$ct = preg_replace( '/[^\P{C}\n]+/u', "", $ct);
echo $ct;
से: UTF 8 स्ट्रिंग न्यूलाइन को छोड़कर सभी अदृश्य वर्णों को हटा दें