არქივი April, 2009

JavaScript: Regex and Multi-line Mode

დღეს აღმოვაჩინე რომ JavaScript – ის Regex იმპლემენტაციას გარდა სხვა ნაკლოვანებებისა ასევე არ გააჩნია ე.წ. “multi-line match mode”. ამ შემთხვევაში ლაპარაკი არ მაქვს რეგულარული გამოსახულების “m” მოდიფიკატორის მხარდაჭერაზე, ლაპარაკი მაქვს “s” მოდიფიკატორზე რომელიც “.“(წერტილი) სიმბოლოს აიძულებს გარდა სხვა სიმბოლოებისა(ნაგულისხმევად “.” ნიშნავს “ნებისმიერი სიმბოლო გარდა ახალი სტრიქონის სიმბოლოსი”) ასევე მოძებნოს ახალი სტრიქონის სიმბოლო.

ჩემი მარტივი ამოცანის გადასაჭრელად საჭირო იყო მოცემულ ტექსტში მეპოვა შემდეგი ტიპის მონაკვეთი:

1
2
3
function myFunction($param1, $param2) {
      return array($param1, $param2);
}

ხოლო ნაპოვნი მონაკვეთიდან ამომეღო {code}{/code} ტაგებს შორის მოქცეული ტექსტი. თუმცა ეს გასაგები მიზეზების გამო არ გამომივიდა.

ნებისმიერ PCRE – სთან თავსებად იმპლემენტაციას გააჩნია “s” მოდიფიკატორი რომლის მეშვეობითაც მსგავსი ამოცანა წყდება ძალიან მარტივად. მაგალითად PHP – ში რეგულარულ გამოსახულებას ჩავწერდით შემდეგნაირად:

1
2
3
//ყურადღება მიაქციეთ გამოსახულების ბოლოში
//მიწერილ "s" სიმბოლოს
$regex = '/{code lang="(\w+)"}(.*?){\/code}/s'

სამწუხაროდ ასეთ გამოსახულებას JavaScript – ში ვერ დავწერთ. თუმცა, ცოტაოდენი კვლევაძიებისა და ექსპერიმენტების შემდგომ მივაგენი გამოსავალს რაც გამოიხატება სპეციფიური ე.წ. character class – ის გამოყენებაში. ამისათვის საჭიროა “\s” და “\S” მეტა სიმბოლოების დაჯგუფება character class – ში. შედეგად მივიღებთ შემდეგ გამოსახულებას:

1
[\s\S]

სადაც “\s” შეესაბამება ნებისმიერ უხილავ სიმბოლოს, ხოლო “\S” შეესაბამება ნებისმიერ არა უხილავ სიმბოლოს.

შედეგად მივიღე ასეთი JavaScript – ის რეგულარული გამოსახულება:

1
/{code\s+lang="(\w+)"}([\s\S]*){\/code}/

ეს გამოსახულება მუშაობს ანალოგიურად PCRE – სთან თავსებადი გამოსახულებისა რომელიც იყენებს “s” მოდიფიკატორს.

ტეგები: ,

bmu.li

bmuli_logoესე იგი, იშვიათად თუ მახარებს რაიმე ქართულ ვებში, თუმცა გუშინ ირაკლი შემომეხმიანა და თავისი ახალი პროექტის შესახებ შემატყობინა ეს არის სოციალური სერვისი სახელად ბმუ.ლი. რა საჭიროა ასეთი სერვისი? იხ. ციტირება სერვისის ვებ საიტიდან:



წარმოიდგინეთ, რომ Amazon.com-ზე იპოვეთ საინტერესო ფოტო-კამერა, და გნებავთ მეგობარს გაუგზავნოთ მასზე ლინკი SMS-ით. Amazon-ის მისამართები საკმაოდ გრძელია და დაახლოებით ასე გამოიყურება:

http://www.amazon.com/Canon-Digital-Camera-18-55mm-3-5-5-6/dp/B0012YA85A/ref=sr_1_1? ie=UTF8&s=photo&qid=1239587390&sr=1-1

ცხადია ამხელა მისამართს SMS-ში არავინ აკრეფს. ამიტომ, თქვენ შეგიძლიათ შეამოკლოთ ის bmu.li-ს საშუალებით, რის შედეგადაც მიიღებთ მოკლე მისამართს, მაგალითად: http://bmu.li/ss4 რომლის SMS-ით გაგზავნაც არანაირ პრობლემას აღარ წარმოადგენს.
bmu.li მხოლოდ SMS-ისთვის არ არის სასარგებლო. იგი შეგიძლიათ გამოიყენოთ ყველგან სადაც გრძელი მისამართების გაცვლა მოუხერხებელია: ფორუმებზე, ბლოგებზე, სოციალურ ქსელებში (ფეისბუკი, ოდნოკლასნიკი და სხვ.), ტვიტერში, იმეილში, გაზეთებში, რადიოს და სატელევიზიო რეკლამებში და გამოშვებებში ან თუნდაც მეგობრისთჳის ფურცლის ნაგლეჯზე მისამართის უცებ დასაწერად.

ყველაფერი ძალიან მარტივია. ამ სერვისის მეშვეობით შეგვიძლია წარმატებით დავამოკლოდ უსაშველოდ გრძელი და გაუგებარი URL – ები სულ რაღაც 10 სიმბოლომდე(http:// პრეფიქსის გამოკლებით) და გამოვიყენოთ უამრავ შემთხვევაში.

მოკლედ ძალიან, ძალიან სასარგებლო სერვისია რომელიც აუცილებლად გამოგადგებათ და იმედია სათანადოდ დავაფასებთ სულ ცოტა ხანში :)

ასევე მინდა ცოტათი გავთქვა ინსაიდერული ინფორმაცია და გითხრათ, რომ, სულ ცოტა ხანში კიდევ რამდენიმე საინტერესო სირპრიზი დაემატება სერვისს რაც კიდევ უფრო კომფორტულს გახდის მის მოხმარებას.

ასე რომ Hold on B-)

ტეგები:

HTML Form “elements” Property

ამ პოსტის დაწერამდე რამდენიმე წუთით ადრე წავაწყდი HTML form ელემენტის elements თვისებასთან დაკავშირებულ ერთ პრობლემას(შეცდომას) რომლის შესახებაც აქამდე არაფერი მსმენია და ცოტა არ იყოს უაზროდ დამახარჯინა დრო.

ცნობილია, რომ form ელემენტის აღნიშნული თვისება არის HTMLCollection ტიპის კოლექცია და იგი შეიცავს კონკრეტული HTML ფორმის შიგნით გამოყენებულ ყველა(input, select, button) ელემენტს. სწორედ ეს კოლექცია წარმოადგენს საჭირო ფორმის ელემენტებთან წვდომის ყველაზე უსაფრთხო(თურმე პირობითად) გზას.

როგორც აღმოჩნდა თუ ფორმის ელემენტებს მოვათავსებთ fieldset ტეგში(და წესით ეს ასეც უნდა გავაკეთოთ) elements კოლექცია მოულოდნელ რეზულტატს დაგვიბრუნებს. კერძოდ კი fieldset ელემენტიც(ან ელემენტები) ამ კოლექციაში აღმოჩნდება.

ჩემი ამოცანა მდგომარეობდა შემდეგში, რომ ფორმის ყველა ელემენტებისაგან მიმეღო მათი სახელებისა და მნიშნვნელობების ე.წ. key/value ობიექტი:

1
2
3
4
5
var map = {}, els = target.form.elements;
for (var i = 0, el; (el = els[i++]);) {
   map[el.name] = el.value;
}
console.log(map);

თუმცა ძალიან უცნაური შედეგი მივიღე რადგან fieldset ელემენტს არც name და არც value თვისებები არ გააჩნია.

პრობლემის იდენტიფიცირების შემდგომ ინტერნეტში მოვიძიე მცირეოდენი ინფორმაცია:

The HTML 4 standard adds new <fieldset> and <label> tags to the set of elements that can appear within a form. In IE 5 and later, placing a <fieldset> in a form causes a corresponding object to be added to the form’s elements[] array. Fieldset elements are not scriptable in interesting ways like other form elements are, and their objects do not have a type property like other form elements do. Therefore, the presence of Fieldset objects in the elements[] array seems like a mistaken design decision. This is particularly true since <label> tags do not cause corresponding objects to be added to the elements[] array. The Mozilla and Netscape 6 browsers have chosen to follow Microsoft’s lead on this in order to be compatible with IE.

What this means is that if you define a form that contains fieldsets, the contents of the elements[] array differ in recent, HTML 4-capable browsers and in older, pre-HTML 4 browsers. In this situation, using position-based numeric indexes in the elements[] array is not portable, and you should define name attributes for all your form elements and refer to them by name.

მოკლედ კვლავ IE :D ნუ რას ვიზამთ რეალობა ასეთია :P

ტეგები: , ,