NSString strip regular \ escape characters how? - iphone

I need an efficient piece of code that strips escape characters. This is regular escapes not HTML escape characters.
Example: "\"", "\\\\", "\", "\\"
I want a general algorithm to strip any kind of escape sequences.
Could use any utility like regular expression.
(NSString*) unescape:(NSString*) string {
....
}
This is the answer I wrote:
-(NSString*) unescape:(NSString*) string
{
for(int i = 0; i < string.length; i++) {
char a = [string characterAtIndex:i];
if([string characterAtIndex:i] == '\\' ) {
string = [string stringByReplacingCharactersInRange:NSMakeRange(i,1) withString:#""];
}
}
return string;
}

Try to use below code for HTML escape
(NSString*) unescape:(NSString*) string
{
return [string stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
}
for regular Escape
(NSString*) unescape:(NSString*) string
{
return [string stringByReplacingOccurrencesOfString:#"\\\"" withString:#"\""];
}

The best method that you should use is:
- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set
You would call it using:
string = [string stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];

If you want to use regex, you can try with regex pattern \\[bntr\\\\"]. Or use any required regex pattern here.
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:
#"\\[bntr\\\\"]" options:0 error:nil];
[regex replaceMatchesInString:str options:0 range:NSMakeRange(0, [str length]) withTemplate:#""];

I apoligize for my answer...
NSString *_string = #"\\\\ dfsdg \\ tr\\\\t \\\\\\tw\\\\\\\\w\\ t\\ \\\\ \\ \\\\\\ rret\\ \\\\ \\\\\\\\";
NSLog(#"%#", [_string stringByReplacingOccurrencesOfString:#"\\" withString:#""]);
result is:
dfsdg trt tww t rret

If its URL Encoded, you are probably looking for:
stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding

Hope this helps:
-(NSString *)unescape:(NSString *)string
{
if ([string rangeOfString:#"\\"].location != NSNotFound)
{
[string stringByReplacingCharactersInRange:#"\\" withString:#"\\"];
}
else if ([string rangeOfString:#"\\\\"].location != NSNotFound)
{
[string stringByReplacingCharactersInRange:#"\\\\" withString:#"\\"];
}
else if ([string rangeOfString:#"\\\\"].location != NSNotFound)
{
[string stringByReplacingCharactersInRange:#"\\\\" withString:#"\\"];
}
}

Related

Trimmed values while parsing XML file [duplicate]

I'm new with iOS developing and i'm looking for a solution to compare two String ignoring the spaces at the beginning or at the ending. For example, "Hello" == "Hello " should return true.
I've serached for a solution but i didn't find nothing in Swift. Thanks
I would recommend you start by trimming whitespace from the String with this Swift code:
stringToTrim.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
NSString *string1 = #" Hello";
//remove(trim) whitespaces
string1 = [string1 stringByReplacingOccurrencesOfString:#" " withString:#""];
NSString *string2 = #"Hello ";
//remove(trim) whitespaces
string2 = [string1 stringByReplacingOccurrencesOfString:#" " withString:#""]
// compare strings without whitespaces
if ([string1 isEuqalToString:string2]) {
}
So if you want to use it directly -
if ([[yourString1 stringByReplacingOccurrencesOfString:#" " withString:#""] isEuqalToString:[yourString2 stringByReplacingOccurrencesOfString:#" " withString:#""]]) {
// Strings are compared without whitespaces.
}
Above will remove all whitespaces of your string, if you want to remove only leading and trailing whitespaces then there are a couple of post already available, you can create a category of string as mentioned in following stack overflow post - How to remove whitespace from right end of NSString?
#implementation NSString (TrimmingAdditions)
- (NSString *)stringByTrimmingLeadingCharactersInSet:(NSCharacterSet *)characterSet {
NSUInteger location = 0;
NSUInteger length = [self length];
unichar charBuffer[length];
[self getCharacters:charBuffer];
for (location; location < length; location++) {
if (![characterSet characterIsMember:charBuffer[location]]) {
break;
}
}
return [self substringWithRange:NSMakeRange(location, length - location)];
}
- (NSString *)stringByTrimmingTrailingCharactersInSet:(NSCharacterSet *)characterSet {
NSUInteger location = 0;
NSUInteger length = [self length];
unichar charBuffer[length];
[self getCharacters:charBuffer];
for (length; length > 0; length--) {
if (![characterSet characterIsMember:charBuffer[length - 1]]) {
break;
}
}
return [self substringWithRange:NSMakeRange(location, length - location)];
}
#end
Now once you have the methods available, you can call these on your strings to trim leading and trailing spaces like -
// trim leading chars
yourString1 = [yourString1 stringByTrimmingLeadingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
// trim trainling chars
yourString1 = [yourString1 stringByTrimmingTrailingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
// trim leading chars
yourString2 = [yourString2 stringByTrimmingLeadingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
// trim trainling chars
yourString2 = [yourString2 stringByTrimmingTrailingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
// compare strings
if([yourString1 isEqualToString: yourString2]) {
}
For Swift 3.0+
Use .trimmingCharacters(in: .whitespaces) before comparison or .trimmingCharacters(in: .whitespacesAndNewlines)
In Swift 4
Use it on any String type variable.
extension String {
func trimWhiteSpaces() -> String {
let whiteSpaceSet = NSCharacterSet.whitespaces
return self.trimmingCharacters(in: whiteSpaceSet)
}
}
And Call it like this
yourString.trimWhiteSpaces()

NSString value validation in iOS

This simple validation method for NSString makes trouble.
I have an NSString value and I want to validate the string, i.e, if the string contains only 'a to z' (or) 'A to Z' (or) '1 to 9' (or) '#,!,&' then the string is valid. If the string contains any other values then this the NSString is invalid, how can i validate this..?
As example:
Valid:
NSString *str="aHrt#2"; // something like this
Invalid:
NSString *str="..gS$"; // Like this
Try using character sets:
NSMutableCharacterSet *set = [NSMutableCharacterSet characterSetWithCharactersInString:#"#!&"];
[set formUnionWithCharacterSet:[NSCharacterSet alphanumericCharacterSet]];
if ([string rangeOfCharacterFromSet:[set invertedSet]].location == NSNotFound) {
// contains a-z, A-Z, 0-9 and &#! only - valid
} else {
// invalid
}
I would do something using stringByTrimmingCharactersInSet
Create an NSCharacterSet containing all valid characters, then trim those characters from the test string, if the string is now empty it is valid, if there are any characters left over, it is invalid
NSCharacterSet *validCharacters = [NSCharacterSet characterSetWithCharactersInString:#"myvalidchars"];
NSString *trimmedString = [testString stringByTrimmingCharactersInSet:validCharachters];
BOOL valid = [trimmedString length] == 0;
Edit:
If you want to control the characters that can be entered into a text field, use textField:shouldChangeCharactersInRange:replacementString: in UITextFieldDelegate
here the testString variable becomes the proposed string and you return YES if there are no invalid characters
The NSPredicate class is what you want
More info about predicate programming. Basically you want "self matches" (your regular expression). After that you can use the evaluateWithObject: method.
EDIT Easier way: (nevermind, as I am editing it wattson posted what I was going to)
You can use the class NSRegularExpression to do this.
https://developer.apple.com/library/mac/documentation/Foundation/Reference/NSRegularExpression_Class/Reference/Reference.html
You can also use NSRegularExpression to search your NSString, if it contains only the valid characters (or vice versa).
More info:
Search through NSString using Regular Expression
Use regular expression to find/replace substring in NSString
- (BOOL)validation:(NSString *)string
{
NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:#"1234567890abcdefghik"] invertedSet];
NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:#""];
return ([string isEqualToString:filtered]);
}
In your button action:
-(IBAction)ButtonPress{
if ([self validation:activity.text]) {
NSLog(#"Macth here");
}
else {
NSLog(#"Not Match here");
}
}
Replace this "1234567890abcdefghik" with your letters with which you want to match
+(BOOL) validateString: (NSString *) string
{
NSString *regex = #"[A-Z0-9a-z#!&]";
NSPredicate *test = [NSPredicate predicateWithFormat:#"SELF MATCHES %#", emailRegex];
BOOL isValid = [test evaluateWithObject:string];
return isValid;
}
You can simply do it using NSMutableCharacterSet
NSMutableCharacterSet *charactersToKeep = [NSMutableCharacterSet alphanumericCharacterSet];
[charactersToKeep addCharactersInString:#"#?!"];
NSCharacterSet *charactersToRemove = [charactersToKeep invertedSet]
NSString *trimmed = [ str componentsSeparatedByCharactersInSet:charactersToRemove];
if([trimmed length] != 0)
{
//invalid string
}
Reference NSCharacterSet
You can use regex. If every thing fails use brute force like
unichar c[yourString.length];
NSRange raneg={0,2};
[yourString getCharacters:c range:raneg];
// now in for loop
for(int i=0;i<yourString.length;i++)
{
if((c[i]>='A'&&c[i]<='Z')&&(c[i]=='#'||c[i]=='!'||c[i]=='&'))
{
//not the best or most efficient way but will work till you write your regex:P
}
}

How to detect UISearchBar is containing blank spaces only

How to detect if UISearchBar contains only blank spaces not any other character or string and replace it with #""?
You can trim the string with a character set containing whitespace using the NSString stringByTrimmingCharactersInSet message (using the whitespaceCharacterSet):
NSString * searchString = [searchBar.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
if (![searchString length])
// return ... search bar was just whitespace
You can check as
[yourSearchBar.text isEqualToString:#""]
Hope it helps.
if([searchBar.text isEqualToString:#""] && [searchBar.text length] ==0){
// Blank Space in searchbar
else{
// Do Search
}
Use isEqualToString method of NSString
Use stringByTrimmingCharactersInSet to trim the character from NSString.
- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set
Use as below.
NSString* myString = mySearchBar.text
myString = [myString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
Here's how you detect and replace it: (assuming the UISearchField is called searchBar)
NSString*replacement;
if ([searchBar.text isEqualToString:#" "])
{
replacement = [NSString stringByReplacingOccurancesOfString:#" " withString:#""];
}
searchBar.text = replacement;
Have a look in the Apple Documentation for NSString for more.
Edit:
If you have more than once space, do this:
NSString *s = [someString stringByReplacingOccurrencesOfString:#" "
withString:#""
options:NSRegularExpressionSearch
range:NSMakeRange(0, [someString length])
];
searchBar.text = s;
This worked for me: if you are using #"" or length already to control say a button then this version really does detect the whitespace, if a space has been entered...
if([activeField.text isEqualToString:#" "] && [activeField.text length] ==1){
// Blank Space in searchbar
{
// an alert example
}

NSXMLParser Encoded by Windows-1252

So NSXMLParser has problems parsing strings using the Windows-1252 encoder. Now I did find a solution on this page to convert it to NSUTF8StringEncoding. But now it bumps into characters it can't parse.
So I figured out that it will work if I would escape special characters and then transfer it back after parsing it. For example:
string = [string stringByReplacingOccurrencesOfString:#":" withString:#"__58__"];
Since it is allowed to use the _ character without getting a parser error and in NSXMLParser I can transfer the value back to it's proper character.
So is there a way I can loop through all ASCII character so I can replace all special characters (Except <, > and _ of course)?
Totally untested. I don't even know if it compiles, but it may get you on the right track. string needs to be an NSMutableString.
NSRange r = NSMakeRange(0, [string length]);
while (r.location < [string length])
{
r = [string rangeOfCharactersFromSet:[NSCharacterSet symbolCharacterSet] options:0 range:r];
if (r.location != NSNotFound)
{
NSMutableString *replacement = [[NSMutableString alloc] initWithCapacity:6];
for (NSUInteger i = r.location; i <= NSMaxRange(r); i++)
{
unichar c = [string characterAtIndex:i];
if (c != "_")
{
[replacement appendFormat:#"__%d__", (unsigned)c];
}
}
[string replaceCharactersInRange:r withString:replacement];
[replacement release]; replacement = nil;
r.location = r.location + [string length] + 1;
r.length = [string length] - r.location;
}
}
Assuming you have a NSMutableString str, you can do the following:
NSMutableString *str = ...;
[str replaceOccurrencesOfString:":" withString:#"__58__"
options:NSLiteralSearch
range:NSMakeRange(0, [str length])];
[str replaceOccurrencesOfString:"&" withString:#"__38__"
options:NSLiteralSearch
range:NSMakeRange(0, [str length])];
You see the pattern!
You can also just use XML entities for these values, e.g. replace & with &.
Thanks for the help everybody, this code actually solved my problem:
for (unichar asciiChar = 1; asciiChar <= 255; asciiChar++) {
NSString *stringWithAsciiChar = [NSString stringWithCharacters:&asciiChar length:1];
if (stringWithAsciiChar == nil) continue;
string = [string stringByReplacingOccurrencesOfString:stringWithAsciiChar withString:[NSString stringWithFormat:#"__%d__", asciiChar]];
}

Replace multiple characters in a string in Objective-C?

In PHP I can do this:
$new = str_replace(array('/', ':', '.'), '', $new);
...to replace all instances of the characters / : . with a blank string (to remove them)
Can I do this easily in Objective-C? Or do I have to roll my own?
Currently I am doing multiple calls to stringByReplacingOccurrencesOfString:
strNew = [strNew stringByReplacingOccurrencesOfString:#"/" withString:#""];
strNew = [strNew stringByReplacingOccurrencesOfString:#":" withString:#""];
strNew = [strNew stringByReplacingOccurrencesOfString:#"." withString:#""];
Thanks,
matt
A somewhat inefficient way of doing this:
NSString *s = #"foo/bar:baz.foo";
NSCharacterSet *doNotWant = [NSCharacterSet characterSetWithCharactersInString:#"/:."];
s = [[s componentsSeparatedByCharactersInSet: doNotWant] componentsJoinedByString: #""];
NSLog(#"%#", s); // => foobarbazfoo
Look at NSScanner and -[NSString rangeOfCharacterFromSet: ...] if you want to do this a bit more efficiently.
There are situations where your method is good enough I think matt.. BTW, I think it's better to use
[strNew setString: [strNew stringByReplacingOccurrencesOfString:#":" withString:#""]];
rather than
strNew = [strNew stringByReplacingOccurrencesOfString:#"/" withString:#""];
as I think you're overwriting an NSMutableString pointer with an NSString which might cause a memory leak.
Had to do this recently and wanted to share an efficient method:
(assuming someText is a NSString or text attribute)
NSString* someText = #"1232342jfahadfskdasfkjvas12!";
(this example will strip numbers from a string)
[someText stringByReplacingOccurrencesOfString:#"[^0-9]" withString:#"" options:NSRegularExpressionSearch range:NSMakeRange(0, [someText length])];
Keep in mind that you will need to escape regex literal characters using Obj-c escape character:
(obj-c uses a double backslash to escape special regex literals)
...stringByReplacingOccurrencesOfString:#"[\\\!\\.:\\/]"
What makes this interesting is that NSRegularExpressionSearch option is little used but can lead to some very powerful controls:
You can find a nice iOS regex tutorial here and more on regular expressions at regex101.com
Essentially the same thing as Nicholas posted above, but if you want to remove everything EXCEPT a set of characters (say you want to remove everything that isn't in the set "ABCabc123") then you can do the following:
NSString *s = #"A567B$%C^.123456abcdefg";
NSCharacterSet *doNotWant = [[NSCharacterSet characterSetWithCharactersInString:#"ABCabc123"] invertedSet];
s = [[s componentsSeparatedByCharactersInSet: doNotWant] componentsJoinedByString: #""];
NSLog(#"%#", s); // => ABC123abc
Useful in stripping out symbols and such, if you only want alphanumeric.
+ (NSString*) decodeHtmlUnicodeCharactersToString:(NSString*)str
{
NSMutableString* string = [[NSMutableString alloc] initWithString:str]; // #&39; replace with '
NSString* unicodeStr = nil;
NSString* replaceStr = nil;
int counter = -1;
for(int i = 0; i < [string length]; ++i)
{
unichar char1 = [string characterAtIndex:i];
for (int k = i + 1; k < [string length] - 1; ++k)
{
unichar char2 = [string characterAtIndex:k];
if (char1 == '&' && char2 == '#' )
{
++counter;
unicodeStr = [string substringWithRange:NSMakeRange(i + 2 , 2)]; // read integer value i.e, 39
replaceStr = [string substringWithRange:NSMakeRange (i, 5)]; // #&39;
[string replaceCharactersInRange: [string rangeOfString:replaceStr] withString:[NSString stringWithFormat:#"%c",[unicodeStr intValue]]];
break;
}
}
}
[string autorelease];
if (counter > 1)
return [self decodeHtmlUnicodeCharactersToString:string];
else
return string;
}
Here is an example in Swift 3 using the regularExpression option of replacingOccurances.
Use replacingOccurrences along with a the String.CompareOptions.regularExpression option.
Example (Swift 3):
var x = "<Hello, [play^ground+]>"
let y = x.replacingOccurrences(of: "[\\[\\]^+<>]", with: "7", options: .regularExpression, range: nil)
print(y)
Output:
7Hello, 7play7ground777
If the characters you wish to remove were to be adjacent to each other you could use the
stringByReplacingCharactersInRange:(NSRange) withString:(NSString *)
Other than that, I think just using the same function several times isn't that bad. It is much more readable than creating a big method to do the same in a more generic way.
Create an extension on String...
extension String {
func replacingOccurrences(of strings:[String], with replacement:String) -> String {
var newString = self
for string in strings {
newString = newString.replacingOccurrences(of: string, with: replacement)
}
return newString
}
}
Call it like this:
aString = aString.replacingOccurrences(of:['/', ':', '.'], with:"")