LlSubStringIndex
De DigiWiki.
Version du 13 octobre 2012 à 19:07 par Djphil (discuter | contributions)
Matching against last names:
default { state_entry() { llSensorRepeat("", NULL_KEY, AGENT, PI, 96.0, 20); } sensor(integer NumDet) { integer i; //Loop through all the sensor data and match against " Linden", //this causes it to match with any last name of Linden (since there can't be spaces before the firstname) //Alternatively you could match a firstname with "FirstName " for(i = 0; i < NumDet; ++i) if(~llSubStringIndex(llDetectedName(i), " Linden")) llInstantMessage(llDetectedKey(i), "Hello, I see you!"); } }
Basic Example:
integer index = llSubStringIndex("string data","TEST"); if(index == -1) { llSay(0,"TEST was not found in the string"); } else { llSay(0,"TEST was found in the string."); }
String Cheese
//This example shows how you can ask if a word or group of words is in a given string. //There is a limitation with this function. Your search of the string is for an exact match (case sensitive) //so the string_example below would be hard to match. string string_example = "ThIs serVes As aN exaMplE sTrinG. It ISn't toO coMPleX bUt HaS sOme mIlD vARietY"; //If you chat a question "Search for search_word" within range of the object this script is in //it will recognize (by searching the chat msg) the "search for" part and take the word or words following it //and check the string_example for those words. string search_test_a = "seArCh foR"; //The example below works the same way but searches for the word in front of the recognized trigger question. string search_test_b = "is the word I seek"; //Using this variable provides a way to manipulate the word(s) during the script without damaging the msg. string search_word; default { on_rez(integer param)//Although reseting the script on_rez provides many benefits { //in some cases it would be a bad idea because stored variables, lists and queued events would be trashed. llResetScript(); } state_entry() { //This is just for fun (but better to know what object is talking to you). llSetObjectName("String Cheese"); llListen(0, "", llGetOwner(), "");//Listen to you on the public chat channel for everything you say. } listen(integer chan, string name, key id, string msg) { if(llSubStringIndex(llToUpper(msg), llToUpper(search_test_a)) != -1) { search_word = llStringTrim(llGetSubString(msg, llStringLength(search_test_a), -1), STRING_TRIM); if(llSubStringIndex(llToUpper(string_example), llToUpper(search_word)) != -1) { llSay(0, "I have found the word " + "''" + search_word + "''" + " in the example string"); } else { llSay(0, "I cannot find the word " + "''" + search_word + "''" + " in the example string."); } } if(llSubStringIndex(msg, search_test_b) != -1) { search_word = llStringTrim(llGetSubString(msg, 0, (llSubStringIndex(msg, search_test_b)-1)), STRING_TRIM); if(llSubStringIndex(string_example, search_word) != -1) { llSay(0, "I have found the word " + "''" + search_word + "''" + " in the example string"); } else { llSay(0, "I cannot find the word " + "''" + search_word + "''" + " in the example string."); } } } }
Tests to see if one string contains a copy of another:
1. Concise & conventional:
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex { return 0 <= llSubStringIndex(haystack, needle); }
integer startswith(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex { return llDeleteSubString(haystack, llStringLength(needle), -1) == needle; }
integer endswith(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex { return llDeleteSubString(haystack, 0, ~llStringLength(needle)) == needle; }
Note: Some of the snippets above return a result without ever calling llSubStringIndex.
2. Clever & smaller (calculates contains in ~54 bytes rather than ~60):
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex { return ~llSubStringIndex(haystack, needle); }
Note: The llSubStringIndex function returns -1 only when not found and the ~ operator returns zero only for -1, so the clever combination ~llSubStringIndex returns zero only for not found, else nonzero for found.


