როგორ იქცევით ისეთ შემთხვევაში, როდესაც საჭიროა HTML textarea ელემენტიდან მიღებული ტექსტის, HTML დოკუმენტში უცვლელად გამობეჭვდაა საჭირო ანუ ტექსტის ფორმატირების გათვალისწინებით?
ამ შემთხვევაში, ტექსტის აბზაცებად ფორმატირებას ვგულისხმობ, სადაც აბზაცების გამოყოფად იგულისხმება ახალი სტრიქონის სიმბოლო.
მაგალითად ასეთი ტექსტი:
ეს არის ჩვეულებრივი აბზაცი. ეს არის შემდეგი აბზაცი... და კიდევ ერთი აბზაცი..
ამ შემთხვევაში ტექსტის გამოსაბეჭდად გამოვიყენე <pre> ტეგი, რომელიც ტექსტს ახალი სტრიქონის სიმბოლოების გათვალისწინებით ბეჭდავს და არ უკარგავს მას ფორმატირებას. თუმცა, <pre> სრულიად გამოუსადეგარია ბლოგ პოსტის ან ამ ბლოგის მომხმარებლების მიერ დაპოსტილი კომენტარების გამოსატანად.
PHP – ს გააჩნია ფუნქცია სახელად nl2br რომელსაც ყოველი ახალი სტრიქონის სიმბოლო გადაჰყავს <br /> ტეგში, თუმცა არც ეს არის დიდი ხეირი რადგან,
როგორც HTML სპეციფიკაცია გვეუბნება, აბზაცების ფორმატირებისათვის უნდა გამოვიყენოთ <p> ტეგი, თუმცა PHP – ს ასეთი ფუნქცია არ გააჩნია.
მარტივი რეგულარული გამოსახულების დახმარებით მივიღე ასეთი ფუნქცია, რომელიც აღწერილ პრობლემას მარტივად და სწრაფად აგვარებს:
1 2 3 |
თუ ამ ფუნქციას გამოვიყენებთ ზემოთ მოყვანილი ტექსტის დასამუშავებლად, მივიღებთ ასეთ შედეგს:
<p>ეს არის ჩვეულებრივი აბზაცი.</p> <p>ეს არის შემდეგი აბზაცი...</p> <p>და კიდევ ერთი აბზაცი..</p>
აღსანიშნავია რომ, ეს ფუნქცია იგნორირებას უკეთებს ერთმანეთის მიყოლებით აკრეფილ ახალი სტრიქონის სიმბოლოებს.
როგორ მუშაობს თავად რეგულარული გამოსახულება:
$regex = '~
^ # 1) შევამოწმოთ სტრიქონის დასაწყისი
\s* # 2) ნებისმიერი რაოდენობის უხილავი სიმბოლო
(.*?) # 3) ნებისმიერი რაოდენობის ნებისმიერი სიმბოლო
\s* # 4) ნებისმიერი რაოდენობის უხილავი სიმბოლო
$ # 5) შევამოწმოთ სტრიქონის დასასრული
~smx' # 6) smx - გამოსახულების მოდიფიკატორები
ბრჩხილებში მოქცეული გამოსახულების მესამე პუნქტის მეშვეობით ვინახავთ ჩვენთვის საჭირო ტექსტს, იმისათვის რომ მოგვიანებით შევძლოთ მისი გამოყენება, გამოსახულების დანარჩენი ნაწილი კი უბრალოდ ტექსტის შემოწმებისათვის არის საჭირო.
თავად გამოსახულებაზე უფრო საინტერესო მოცემულ შემთხვევაში არის, გამოყენებული რეგულარული გამოსახულების მოდიფიკატორები s და m.
. – წერტილი, რეგულარულ გამოსახულებაში ნიშნავს ნებისმიერ სიმბოლოს ახალი სტრიქონის სიმბოლოს გარდა. ხოლო s მოდიფიკატორი გამოსახულების ბოლოს წერტილს უცვლის მნიშვნელობას და იგი უკვე სხვა ნებისმიერ სიმბოლოსთან ერთად ახალი სტრიქონის სიმბოლოებსაც მოიცავს.
m მოდიფიკატორი თავის მხრივ ცვლის ტექსტის დასაწყისისა(^) და ტექსტის დასასრულის($) სიმბოლოების ქცევას. რაც ნიშნავს იმას, რომ, ეს სიმბოლოები მიუთითებენ არა მთლიანი ტექსტის დასაწყისსა და დასასრულს არამედ ახალი ხაზის სიმბოლოთი გამოყოფილ სტრიქონის დასაწყისსა და დასასრულს.
გამოსახულებაში ასევე მნიშვნელოვანია მეორე და მეოთხე პუნქტები. გამოსახულება უბრალოდ აღნიშნავს ნებისმიერი რაოდენობის უხილავ სიმბოლოს(უხილავ სიმბოლოებს განეკუთვნება ახალი სტრიქონის სიმბოლოც). გამოსახულების ეს ნაწილია საჭიროა იმისათვის რომ ტექსტში არსებულ ერთზე მეტ ახალი სტრიქონის სიმბოლოებს გავუკეთოთ იგნორეირება რათა არ მივიღოთ ცარიელი <p>p</p> ტეგების კომბინაცია.
სულ ეს არის და ეს
ვერ გასწავლე რეგულარული ექსპრესიები რა
რათ უნდა მაგ სიგრძე.
აი ბევრად მოკლე და იგივე შედეგით (ყოველ შემთხვევაში HTML-ის თვალსაზრისით, ამან შეიძლება ცოტა მეტი ცარიელები დატოვოს, მაგრამ HTML დააიგნორებს, ცარიელ ხაზებს პარაგრაფებს არც ეს უკეთებს):
და “m” მოდიფიკატორში მთავარი ის კი არაა თუ როგორ აინტერპრეტიებს ^ და $-ს არამედ ის რომ მრავალხაზიან ლიტერალებზე მუშაობს. დანრჩენი უკვე – მაგის შედეგია.
უჩის, სალდატ, ატამანომ ბუძეშ
@ირაკლი
რამდენი გიწვალია?
დაგიედიტე პოსტ(ებ)ი
\S ნამდვილად არ გამხსენებია სიმართლე გითხრა, უფრო სწორად ბუნდოვნად მქონდა გააზრებული მისი მნიშვნელობა, კარგია რომ ნახე ეს პოსტი და უკეთესი სოლუშენი დადე
ვისწავლით ბოვშები ცოტას
“m” მოდიფიკატორზე ფაქტიურად იგივე მიწერია. რეგექს ძრავი მაგ მოდიფიკატორიდან გამომდინარე წყვეტს როგორი ინტერპრეტირება გაუკეთოს ^/$ მეტა სიმბოლოებს.
P.S.
ეხლა გადავამოწმე შენი სოლუშენი(გულმა არ მომითმინა, დავერიაი ნო პრავერიაო ხომ გაგიგია?
) ხოდა ერთი ასეთი დეტალია, თუ ტექსტში გარდა New Line – სი TAB სიმბოლოებიც გამოიყენება, ასეთ ტექსტსაც <p></p> ტაგებში სვავს. ხოდა ჩემთვის ეგ რეზულტატი სრულიად მიუღებელია
არავითარ შემთხვევაში არ უნდა მოხდეს TAB ების გათვალისწინება… გამომდინარე აქედან, ჩემი სოლუშენი უფრო ეფექტურია(იიიშ)
P.P.S
დამატებით გავტესტე ეხლა. ე.წ. “პრაბელებსაც” ითვალისწინებს შენი პატერნი, და სიტყვებსაც პარაგრაფებად აქცევს. მგონი ნაჩქარევად დაპოსტე ეგ კოდი
P.P.P.S
არც ისე ბუნდოვნად მქონია \S გააზრებული. ვოტ:
გამომდინარე აქედან, შენი პატერნის მიხედვით ძრავი ნებისმიერი whitespace – ს დანახვისთანავე, მანამდე მოძებნილ ტექსტს P ტაგით გაუკეთებს ვრაპს. ეს კი სულაც არ არის ის რაც მე მინდოდა და რასაც ეს პოსტი შეეხება
ხო და პასუხის სისრულისთვის:
უჩის, სალდატ, ატამანომ ბუძეშ
იოსებ შეგიძლია ეს ამიხსნა? ანუ ვერ მივხვდი რა ფუქნცია აკისრია ამას?
@Gio
“\s*” ნიშნავს ნებისმიერი რაოდენობის უხილავ სიმბოლოს, ანუ: პრაბელი, ტაბულაცია, ახალი სტრიქონი და ა.შ…
vinmem dampostet mailze ra tu icit rame iseti skripti magalitad: maq maili da minda chem saitze momivides iq gamogzavnili mesijebi, ra kodi unda gamoviyeno an tu arsebobs egeti rame gtxovt ar daizarot mowera da tu ramea skriptic gamoushvit. aseti ragacis gaketeba minda telepontit agzavnis momxmarebeli surats da tavis ids emailze da is emaili minda chem saitma daamushaos da shesabamisat surati gadmoitanos da im idze dasvas monacemta bazit.aba tu rames shemomtavazebt egeds emailze momweret kacurat da adamianurat gamimartet xeli madloba winaswar
@იოსებ გამარჯობა. ეს ამიხსენი ძალიან გთხოვ შენი იმედი მაქ: Warning: copy() [function.copy]: open_basedir restriction in effect. File(/tmp/phpMAegZJ) is not within the allowed path(s): (/usr/local/www/data/gou.gol.ge) in /usr/local/www/data/gou.gol.ge/doc/test.php on line 15 რა პრობლემასთან მაქ საქმე რო ფუნქცია copy ვერ აკოპირებს ფაილს tmp დან?? წინასწარ მადლობა და ბოდიში რომ ჩემი კომენტარი არ შეესაბამება შენს მიერ დაწერილ თემას