უახლესი სტატიები
მთავარი / Windows მიმოხილვა / Php რეგულარული სტრიქონის ნომრიდან. PHP regexp: რეგულარული გამონათქვამების მაგალითები. რეგულარული გამოხატვის მაგალითები

Php რეგულარული სტრიქონის ნომრიდან. PHP regexp: რეგულარული გამონათქვამების მაგალითები. რეგულარული გამოხატვის მაგალითები

დავიწყოთ იმით, თუ რა არის რეგულარული გამოხატულება. ასე რომ, მიპასუხეთ ამ კითხვაზე: არის თუ არა "ე" სიტყვა "ტესტში"? "ჭამე!" შენ ამბობ. მერე მეორე კითხვას დაგისვამ, როგორ იპოვე ასო „ე“ სიტყვა „ტესტში“? პასუხი აშკარაა, ვიღებთ პირველ სიმბოლოს, ანუ „ტ“-ს და ვადარებთ იმას, რასაც ვეძებთ, ანუ „ე“-ს. თუ ისინი არ არიან თანაბარი, მაშინ ვიღებთ მეორე სიმბოლოს, ანუ „ე“-ს და ვადარებთ იმას, რასაც ვეძებთ, ანუ „ე“. ვოილა! ასანთი იპოვეს. პასუხი: სიტყვა „ტესტი“ შეიცავს ასო „ე“-ს..

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

რისთვის გამოიყენება რეგულარული გამონათქვამები PHP-ში? ჩემს პრაქტიკაში გამოიყენებოდა რეგულარული გამონათქვამები, მაგალითად, იმის დასადგენად, იყო თუ არა მისამართი სწორად შედგენილი ელფოსტა. ასეთი გამონათქვამები ასევე გამოიყენება მომხმარებლის სახელისა და პაროლის სისწორის დასადგენად. რეგულარული გამონათქვამების გამოყენებით, შეგიძლიათ იპოვოთ მისამართი ბმულზე და შეინახოთ იგი. არსებობს ბევრი რამ, რისი გაკეთებაც შეგიძლიათ ამის გაანალიზებით, შეგიძლიათ განსაზღვროთ რეგულარული გამონათქვამები და ორი გვერდითი ფუნქცია. Მთავარი ფუნქცია , ეს არის შესატყვისების ძიება სტრიქონში. გვერდითი მოვლენები მოიცავს ნაპოვნი მატჩების შენახვას და მათ შეცვლას.

პირველი რეგულარული გამოხატულება

თეორიულად, ჩვენ გვესმის, როგორ ვიპოვოთ სიმბოლო "ე" სიტყვა "ტესტში", მაგრამ როგორ ხორციელდება ეს პრაქტიკაში? php-ში რეგულარული გამონათქვამების გამოსაყენებლად, ჩვეულებრივ გამოიყენება შემდეგი ფუნქციები:

preg_match("რეგულარული გამოხატულება (ნიმუში)", "ცვლადი, რომელშიც შესრულებულია ძებნა", "ცვლადი, რომელშიც შენახულია ძიების შედეგი (სურვილისამებრ პარამეტრი)"); - შესატყვისი ფუნქცია
preg_replace("ჩვეულებრივი გამოხატულება (ნიმუში)", "რით შევცვალო ნაპოვნი შესატყვისი", "ცვლადი, რომელშიც ჩანაცვლება ხდება"); - ჩანაცვლება ფუნქცია

დავიწყოთ ამ ფუნქციების გამოყენება სიტყვა "ტესტში" სიმბოლო "e"-ს ძიების მაგალითი.

$a = "ტესტი";
if(preg_match("/e/",$a)) echo "იპოვეს!!";

კოდი აღწერს მდგომარეობას: თუ $a ცვლადში ნაპოვნია ნიმუშის შესატყვისი, მაშინ აჩვენეთ შეტყობინება "აღმოაჩინეს!!" როგორც თქვენ შენიშნეთ, ჩვენი შაბლონი მდებარეობს ორ "/"-ს შორის. IN ამ შემთხვევაშისიმბოლო "/" სიმბოლოა ჩვენი ნიმუშის დასაწყისსა და დასასრულს. იმედი მაქვს, რომ ეს გასაგებია.

ეს ყველაფერი, რა თქმა უნდა, საინტერესოა... მაგრამ ჩვენი თარგი ძალიან მარტივია, არ ფიქრობთ? ყოველივე ამის შემდეგ, ჩვენ იშვიათად გვჭირდება ცვლადში რაიმე სიმბოლოს პოვნა. უმეტეს შემთხვევაში, ბევრი პერსონაჟი უნდა ვიპოვოთ და ასევე უცნობი. Როგორ უნდა იყოს? დავაყენოთ საკუთარ თავს პრობლემა და შევეცადოთ მისი მოგვარება. დავუშვათ, გვაქვს სტრიქონი, რომელიც შედგება რიცხვებისგან და ერთი უცნობი ინგლისური ასოსგან

როგორ მოვძებნოთ ეს წერილი? შეიძლება არსებობდეს ინგლისური ანბანის ნებისმიერი ასო, ასე რომ, როგორ შეგიძლიათ მისი ამოცნობა? თქვენ თავად უპასუხეთ თქვენს კითხვას, არის ნებისმიერი ასო, ანუ ის არის a-დან z-მდე დიაპაზონში. თქვენ შეგიძლიათ გამოიყენოთ დიაპაზონები რეგულარულ გამონათქვამებში. თუ არ ვიცით, რომელ პერსონაჟს ვეძებთ, მაგრამ ზუსტად ვიცით, რომ ეს სიმბოლო ინგლისური ანბანის ასოა, მაშინ ჩანაწერი იქნება შემდეგი:

$a = "123a321";
if(preg_match("//",$a)) echo "იპოვეს!!";

გაითვალისწინეთ, რომ დიაპაზონი მოთავსებულია "[" "]" ფრჩხილებში. ასეთ ფრჩხილებში ჩასმული ყველაფერი განისაზღვრება როგორც ერთისიმბოლო, ამ შემთხვევაში სიმბოლო მერყეობს a-დან z-მდე. თუ ჩვენ გვჭირდება არა ასო, არამედ რიცხვი, მაშინ ჩანაწერი იქნება ასეთი:

$a = "abc1cba";
if(preg_match("//",$a)) echo "იპოვეს!!";

ასევე მინდა აღვნიშნო, რომ რეგულარულ გამონათქვამებს დიდი მნიშვნელობა აქვს, ამიტომ სიმბოლოები "A" და "a" სრულიად განსხვავებულია, ორივე სიმბოლოს მოსაძებნად დაწერეთ ასე:

$a = "123a321";
if(preg_match("//",$a)) echo "იპოვეს!!";

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

$a = "123×321";
if(preg_match("/[a-zA-Z]/",$a)) echo "იპოვეს!!";

მეტახასიათები

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

ხაზი - 123a321
ნიმუში -

ჰმ... შაბლონი რეალურად ემთხვევა ჩვენს სტრიქონს და შესაბამისობის შემოწმების შემთხვევაში, ის მისცემს დიდი ხნის ნანატრი ჭეშმარიტებას! მაგრამ ეს ერთგვარი შრომატევადი ჩანაწერია, არ ფიქრობთ?

აი, როგორ შევამოკლოთ ის:

ხაზი - 123a321
ნიმუში - *

მეჩვენება, რომ ეს უფრო მოკლეა, რა არის "*" სიმბოლო? ეს არის იგივე მეტასიმბოლო, ეს ნიშნავს, რომ ჩვენ მიერ აღწერილი სიმბოლო (კერძოდ, სიმბოლო, რომელიც შეიძლება შეიცავდეს რიცხვებს 0-დან 9-მდე ან ინგლისური ანბანის ასოებს, a-დან z-მდე) შეიძლება განმეორდეს განუსაზღვრელი ვადით, ან ერთზე მეტჯერ. Დიახ დიახ! ეს მეტასიმბოლო იპოვის შესატყვისს ცარიელ ცვლადში, რადგან ჩვენ მიერ აღწერილი სიმბოლოს არარსებობაც კი დაბრუნდება ჭეშმარიტად! დაიმახსოვრე ეს

სხვა რა მეტახასიათები არსებობს?

მაგალითად, მეტანიშანი "+" იგი თითქმის ჰგავს მეტანიშანს "*" ერთი მცირე გამონაკლისით. "*" დაბრუნდება true მაშინაც კი, თუ არ არის სიმბოლო, და "+" შეამოწმებს მინიმუმ ერთი სიმბოლოს არსებობას. ანუ, თუ ხაზი მოითხოვს ყოფნას მინიმალურიერთი სიმბოლო, შემდეგ გამოიყენეთ "+" ნაცვლად "*"

მეტახასიათი "?" ასევე ხშირად გამოიყენება. ეს ნიშნავს, რომ ხაზი არ უნდა შეიცავდეს ერთზე მეტ სასურველ სიმბოლოს. ნება მომეცით მოვიყვან რამდენიმე მაგალითს ჩემს მიერ აღწერილი ბოლო ორი მეტაპერსონაჟისთვის.

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

$a = "qwerty12345";

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

$a = "";
if(preg_match("/+/",$a)) echo "პაროლი სწორია";

თქვენ ვერ ნახავთ შეტყობინებას "პაროლი სწორია". რატომ? იმის გამო, რომ "+" მეტანიშანმა შეამოწმა სტრიქონი, რომ ენახა თუ არა მას ერთი სიმბოლო მაინც.

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

$a = "qwerty12345";
if(preg_match("/+/",$a)) echo "პაროლი სწორია";

და რატომ ვხედავთ ჩვენს შეტყობინებას სწორი პაროლის შესახებ? ეს საკმაოდ მარტივია... ფუნქცია preg_match(); წყვეტს მის შემოწმებას პირველივე მატჩზე. ანუ სიმბოლო „q“ ერგება ჩვენ მიერ აღწერილ შაბლონს და სხვა ყველაფერი აღარ არის მნიშვნელოვანი ფუნქციისთვის რა უნდა გავაკეთოთ? აი, როგორ გამოვასწოროთ ის:

$a = "qwerty12345";
if(preg_match("/^+$/",$a)) echo "პაროლი სწორია";

გამოთქმის დასაწყისში "^" და ბოლოს "$"-ის დამატებით, ჩვენ ვეუბნებით ფუნქციას, თუ რა უნდა შეესაბამებოდეს ნიმუში. ყველახაზი. თუ ამ კოდს გაუშვით, ვერ ნახავთ შეტყობინებას, რადგან პაროლის ბოლოს არის არალეგალური სიმბოლო - სივრცე

ახლა შეცვალეთ მეტანიშანი "+" მეტანიშანზე "?". როგორ ფიქრობთ, რა მოხდება? სწორად, არ იქნება შეტყობინება პაროლის სისწორის შესახებ, რადგან პაროლი შეიცავს ერთზე მეტ სიმბოლოს. იმედი მაქვს, სწორად ავხსენი ამ სამი ხშირად გამოყენებული მეტაპერსონაჟის მუშაობა

ზოგჯერ "არა" უკეთესია

ჩვენ მაინც ვისწავლეთ როგორ შევამოწმოთ პაროლი სწორია და ეს კარგია! ნება მომეცით გითხრათ სტრიქონში რაღაცის მოძებნის სხვა ხერხის შესახებ. ვთქვათ, ჩვენ უნდა შევამოწმოთ რიცხვების არარსებობა სტრიქონში. Როგორ გავაკეთო ეს? აი ხაზი:

(მე სპეციალურად შევიტანე ეს "-_+()" სიმბოლოები, რათა ცხოვრება თაფლივით არ ჩანდეს...) შეგვიძლია ჩამოვაყალიბოთ შემდეგი გამოთქმა:

მაგრამ თქვენ უნდა აღიაროთ, რომ ჩვენ ყოველთვის არ ვიცით, რა სიმბოლოები გამოიყენება ხაზში, მაგრამ ზუსტად ვიცით, რომ მასში რიცხვები არ უნდა იყოს! ამიტომ უფრო ლოგიკური იქნება უბრალოდ დაწეროთ შაბლონი, რომელიც გამოტოვებს ხაზებს, რომელშიც არარიცხვები და არა ის, რომელშიც არის "ღმერთო ჩემო, რამდენი გაუგებარი სიმბოლოა!!!". აქ მოცემულია ასეთი პრობლემების სწორად შედგენილი გამოხატვის მაგალითი:

$a = "a-_+()";
if(preg_match("/^[^0-9]+$/",$a)) echo "ნომრები არ არის!";

როგორ მივაღწიეთ ამას? ჩვენ შევიყვანეთ სიმბოლო მაგრამ!დასაწყისში განთავსებული ქუდი "^" ([^0-9]) მიუთითებს, რომ იქნება არ უნდაიმედი მაქვს, რომ ეს დალაგდა

აბა, ნელ-ნელა შევფუთოთ... ახსნა-განმარტებით ორ მაგალითს მოვიყვან, რომლის დროსაც ვისწავლით ძიების შედეგის ცვლადში შენახვას და საფოსტო მისამართის სისწორის შემოწმებას.

ვნახე და გადავარჩინე!

Ჩემი ბლოგი

$a = " Ჩემი ბლოგი";
preg_match("/ /", $a);

ჩვენს რეგულარულ გამონათქვამში ჩვენ აღვწერეთ ყველა შესაძლო სიმბოლო, რომელიც შეიძლება ჩაერთოს ბმულში. ასევე მინდა მივაქციო ყურადღება ჩვენს გამონათქვამში ციტატას და „/“-ს, მათ წინ უძღვის უკანა ხაზი, რისთვის არის ეს? ფაქტია, რომ "/" და ციტატა თავისთავად განსაკუთრებული სიმბოლოა. და იმისთვის, რომ შაბლონმა აღიქვას ისინი ჩვეულებრივ სიმბოლოებად, საჭიროა მათი ეკრანიზაცია. გაქცევა კეთდება სპეციალური სიმბოლოების წინ უკანა ხაზის დამატებით. იმედი მაქვს გასაგებია

$a = " Ჩემი ბლოგი";
preg_match("/ /", $a, $b);

შესაბამისად, საჭიროა დამატებითი პარამეტრის დამატება $b ცვლადის სახით, რომელშიც შეინახება ნაპოვნი ბმული. თქვენ ასევე უნდა იცოდეთ, რომ ძიების შედეგი მოთავსებულია მასივში. აქედან გამომდინარე, ცვლადი $b არის მასივი. ინფორმაცია, რომელსაც ჩვენ ვეძებთ, არის ინდექსში 1. ეს ნიშნავს, რომ ძიების შედეგი არის $b ცვლადში. მოდით გამოვხატოთ შედეგი ეკრანზე:

$a = " Ჩემი ბლოგი";
preg_match("/ /", $a, $b);
ექო $b;

სწორი მისამართი წარმატების გასაღებია!

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

  • ინგლისური ასოები, რიცხვები, "_", "-" მმმმმ, როგორც ჩანს, ყველაფერი... აქედან განვაგრძობთ.
  • შემდეგი გვაქვს "@"
  • შემდეგ ინგლისური ასოები
  • შემდეგი, პერიოდი
  • და ისევ ინგლისური ასოები...

ასე რომ, რეგულარული გამოხატულება იქნება შემდეგი:

$a = " [ელფოსტა დაცულია]";
if(preg_match("/^+@+.+$/", $a)) echo "ელ.ფოსტის მისამართი სწორია!";
else echo "ელ.ფოსტის მისამართი სწორად არ არის დაწერილი!";

კარგი... იმედი მაქვს, რომ ახლა არ შეგაშინებთ ასეთი ჩანაწერები და თქვენ საკმაოდ კარგად გაიგებთ მათ.

და ბოლოს, მინდა ვთქვა რაღაც. სტატია რთული აღმოჩნდა და ამავდროულად მოიცავდა შესაძლებლობების მხოლოდ ნაწილს. თუ თქვენ კითხულობთ ამ წინადადებას, მაშინ დიდი ალბათობით თქვენ წაიკითხეთ ბოლომდე, რისთვისაც დიდი მადლობა

რაც შეეხება სტატიების სერიას cms ბლოგის შემუშავების შესახებ, სერიის პირველი ნაწილი დახურულს ვაცხადებ!უახლოეს მომავალში ჩვენ დავიწყებთ ადმინისტრაციული პანელის დანერგვას, ასე რომ არ "გადართოთ" თუ რაიმე შეკითხვა გაქვთ, სიამოვნებით გიპასუხებთ. ყველაფერი საუკეთესო შენთვის, ეს ყველაფერი ჩემგანაა!

) მე გაჩვენეთ რეგულარული გამონათქვამების გამოყენების მაგალითი გვერდის საწყისი კოდის კონკრეტული ნაწილების მოსაძებნად. ახლა ჩვენ ვისწავლით როგორ დავწეროთ ისინი თავად. ეს უნარი დაგეხმარებათ დაწეროთ, გაასუფთავოთ ტექსტი არასაჭირო ფრაგმენტებისგან, მოძებნოთ საჭირო ნაწილები ტექსტის დიდი მოცულობით და ა.შ.

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

  • preg_replace — მოძებნეთ და შეცვალეთ ტექსტი, რომელიც შეესაბამება ჩვეულებრივ გამონათქვამს;
  • preg_match - უბრალოდ რეგულარული ძებნა;
  • preg_split - ძიება და გაყოფა ტექსტი.

ყოველ შემთხვევაში, წინა გაკვეთილებზე ვიყენებდით მათ. უფრო ზუსტად, preg_match-ის ნაცვლად იყო preg_match_all, მაგრამ ეს არსებითად იგივეა, მხოლოდ ეს უკანასკნელი არ წყვეტს ძიებას პირველი აღმოჩენის შემდეგ. ანუ თუ გამოვიყენებთ preg_match-ს, ჩვენ ვერ ვიპოვით ყველა მოვლენას, არამედ მხოლოდ პირველს.

რომელ სიტუაციაში ფუნქციის არჩევა საკმაოდ მარტივია. ჩვენ უნდა შევცვალოთ - ვიყენებთ ჩანაცვლებას, როგორც იმ შემთხვევაში, როდესაც გვჭირდებოდა გვერდის კოდის არასაჭირო ნაწილების ამოღება, გახსოვთ?

$page = preg_replace("/ ^]/i", "", $გვერდი); $გვერდი = preg_replace ("/ ^]/i", "", $გვერდი); $გვერდი = str_replace ("", "", $page);

ფუნქციის პირველი პარამეტრი არის რეგულარული სიმბოლო, რომელიც განსაზღვრავს რას ვეძებთ. მეორე არის ის, რითაც ჩვენ მას ვცვლით. მესამე - სად ვეძებთ? აქედან გამომდინარე, აქ ჩვენ ავიღეთ $page ცვლადი და მივანიჭეთ მას preg_replace ფუნქციის შედეგი, სადაც ვეძებდით ყველა შეყვანის type=checkbox, ასევე გახსნის და დახურვის ეტიკეტებს. მათ ჩაანაცვლეს ისინი "-ით, ანუ უბრალოდ წაშალეს. იმედია აქ ყველაფერი ნათელია. ცოტა მოგვიანებით გადავალთ თავად გამოხატვის (ფუნქციის პირველი პარამეტრის) ანალიზზე.
ასევე იყო preg_match_all გამოყენების მაგალითი, რომელიც სასარგებლო იყო დარჩენილი ტექსტის ყველა ბმულის მოსაძებნად. მაშინ გვჭირდებოდა ბმულები, რადგან ისინი შეიცავდნენ საკვანძო სიტყვებს, რომლებსაც ჩვენ ვაანალიზებდით. აი რა მოხდა:

Preg_Match_all("/ ]+?>(.*?)<\/a>/uis",$page,$ok); for ($j=0; $j ".$ok[$j].""; }

პირველი პარამეტრი კვლავ ჩვეულებრივი გამოხატულებაა, რათა იპოვოთ ყველა ბმული, რომელიც ბუნებრივად არის ჩასმული "a" ტეგში (თუ არ იცნობთ html მარკირებას, წაიკითხეთ). მეორე არის ცვლადი, რომელიც შეიცავს ტექსტს, რომელიც მოძებნილი იქნება. მესამე პარამეტრი არის ცვლადი, რომელშიც მოთავსებულია შედეგი - $ok. ამის შემდეგ, რჩება მხოლოდ $ok-ის ყველა საჭირო ელემენტის გავლა, რათა მივიღოთ ჩვენთვის საჭირო გასაღების დაჭერა. ცალკე, უნდა ითქვას, რომ გამოსავალზე ვიღებთ მრავალგანზომილებიან მასივს. ამიტომ ჩვენ ვაჩვენეთ ის ასე კომპლექსურად: $ok[$j]. მასივის სტრუქტურის სანახავად გამოიყენეთ ქვემოთ მოცემული ფუნქცია და ყველაფერს გაიგებთ.

Print_r ($ok);

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

როგორ დავწეროთ რეგულარული წინადადებები

პირველ რიგში, მოდით შევხედოთ ძირითად სტრუქტურებს. გამონათქვამებს აქვთ ვარიანტები. ისინი მითითებულია ერთი ასოთი და იწერება ბოლოს, წინ უძღვის ხაზი.

გარდა ამისა, მხარდაჭერილია შემდეგი მეტაგმირები:

მეტახასიათებს, თავის მხრივ, შეიძლება ჰქონდეთ მოდიფიკატორები:

ახლა ჩვენ შეგვიძლია გადავიდეთ ჩვენი რეგულარული შაბლონების ანალიზზე ბოლო გაკვეთილიდან. ზემოთ მოყვანილი ნიშნებიდან გამომდინარე, შევეცადოთ გავიგოთ რა გვაქვს. აი გამოთქმა:

/^]/ი

პირველი და ბოლო ხაზები „/“ მიუთითებს, რომ მათ შიგნით არის რეგულარული გამოხატულება. ამავდროულად, უკანასკნელის შემდეგ ჩვენ დავაყენებთ "i", ეს არის ვარიანტი, როგორც პირველ ცხრილში - არ გაითვალისწინოთ შემთხვევა. ზოლების შიგნით არის თავად რეგულარული მიმდევრობა. ის იწყება ნაკლები ნიშნით და შეყვანის ტეგით, და ყველაფერი, რაც ამის შემდეგ მოდის, სანამ წერტილის ნიშანს მხოლოდ უბრალო ტექსტი უნდა მოძებნოთ. მაგრამ თავად წერტილი და მის შემდეგ სიმბოლოები უფრო საინტერესოა. ამ შემთხვევაში კონსტრუქცია „.*?“ ნიშნავს სიმბოლოების ნებისმიერ თანმიმდევრობას. ანუ თუ გავაერთიანებთ მხოლოდ ტექსტს და ამ კონსტრუქციას, მაშინ ავირჩევთ მთელ ტექსტს პირველი გაჩენის შემდეგ და ბოლომდე. შესაჩერებლად, თქვენ უნდა შეხვდეთ ან დახურულ HTML „მეტზე“ ტეგს ან ახალი ხაზის სიმბოლოს. ეს დიზაინი სწორედ ასეთ შესაძლებლობას გვაძლევს:

კვადრატულ ფრჩხილებში სიმბოლოები დაკავშირებულია ლოგიკური OR-ით. დასასრული უფრო დიდია ვიდრე ნიშანი ან ხაზის დასაწყისი.
ეს არის მთელი გამოთქმა, მასში ჩვენ ვაყენებთ დაწყების, შუა და დასრულების მდგომარეობას. არ არის რთული, არა? აქ არის ილუსტრაცია სიცხადისთვის:

მოდით შევხედოთ კიდევ ერთ რამეს ყველაფრის გასამყარებლად. ჩვენ ვეძებდით მათთან ბმულებს:

/]+?>(.*?)<\/a>/ uis

ჩვენ ვკითხულობთ გამონათქვამს. ისევ, ჩვენ პირველ რიგში უგულებელყოფთ ხაზებს და ვარიანტებს. "uis" დროშები თავისთავად გასაგებია, გარდა "u", რომელიც მე არ აღვწერე - ეს აჩვენებს, რომ ჩვენ ვიყენებთ Unicode კოდირებას. ბევრი არ დარჩა. დასაწყისი არის "a" ტეგი, რომელიც იხსნება, შემდეგ მოდის კლასი

რაც ნიშნავს არ აღემატება ან ნაკლები (HTML ტეგების გახსნა და დახურვა), ანუ ნებისმიერი სიმბოლო ამ შემთხვევაში. „+?“ ემატება კლასს, რაც ნიშნავს, რომ ეს კლასი იქნება 1 ან მეტჯერ (მაგრამ აუცილებლად 1-ჯერ). და შემდეგ მოდის დახურვის html ტეგი "a" ტეგისთვის. ბმულის შიგნით არის ტექსტი, რომელიც მითითებულია ჯგუფის მიერ

ბოლოს და ბოლოს, ჩვენ არ ვიცით, რა სახის ტექსტი იქნება იქ, ამიტომ განვსაზღვრავთ ასეთ ჯგუფს. და ბოლოს არის დახურვის ტეგი "a":

გთხოვთ, გაითვალისწინოთ, რომ ხაზს გავურბივართ უკანა ხაზის გამოყენებით ისე, რომ იგი აღიქმებოდეს როგორც მარტივი ტექსტი.

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

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

ინტერნეტისა და WEB-ის განვითარების ენების სწრაფმა განვითარებამ მოითხოვა უნივერსალური და კომპაქტური ინსტრუმენტების შექმნა ტექსტური ინფორმაციის დასამუშავებლად, ამისათვის საჭირო კოდის მინიმალური რაოდენობით. PHP ენა, რომელიც პოპულარულია დამწყებთათვის და პროფესიონალ დეველოპერებში, არ არის გამონაკლისი. რეგულარული გამოხატვა, როგორც ტექსტის შაბლონის ენა, საშუალებას გაძლევთ გაამარტივოთ ტექსტის დამუშავების ამოცანები და შეამციროთ პროგრამის კოდი ათობით და ასობით სტრიქონით. ბევრი პრობლემის გადაჭრა მის გარეშე შეუძლებელია.

რეგულარული გამონათქვამები PHP-ში

PHP ენა შეიცავს რეგულარულ გამონათქვამებთან მუშაობის სამ მექანიზმს - "ereg", "mb_ereg" და "preg". ყველაზე გავრცელებული არის "preg" ინტერფეისი, რომლის ფუნქციები უზრუნველყოფს წვდომას PCRE რეგულარული გამოხატვის ბიბლიოთეკაზე, რომელიც თავდაპირველად შეიქმნა Perl ენისთვის, რომელიც შედის PHP-ში. Preg ფუნქციები ეძებს მოცემულ ტექსტურ სტრიქონს თანხვედრებს კონკრეტული ნიმუშის მიხედვით რეგულარულ გამოხატვის ენაზე.

სინტაქსის საფუძვლები

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

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

მაგალითად, გამონათქვამში /\d(3)-\d(2)-\d(2)/მგამყოფი იქნება «/» , შემდეგ მოდის ნიმუში და სიმბოლო "მ"იქნება მოდიფიკატორი.

რეგულარული გამონათქვამების მთელი ძალა დაშიფრულია მეტანიშვნების გამოყენებით. ენის მთავარი მეტახასიათი არის უკანა ხაზი - “\”. ის აბრუნებს პერსონაჟის ტიპს, რომელიც მას მოსდევს (ანუ, ჩვეულებრივი პერსონაჟი ხდება მეტახასიათი და პირიქით). კიდევ ერთი მნიშვნელოვანი მეტანიშანი არის წინა ზოლი "|", რომელიც განსაზღვრავს ნიმუშის ალტერნატიულ ვარიაციებს. მეტახასიათების მეტი მაგალითები:

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

ქვენიმუშები

PHP-ში, რეგულარული ქვენიმუშები გამოყოფილია ფრჩხილებით და ზოგჯერ უწოდებენ "ქვეგამოთქმებს". შეასრულეთ შემდეგი ფუნქციები:

    ალტერნატივების ხაზგასმა. მაგალითად, შაბლონი სითბო (რაღაც|ჩიტი|)შეესაბამება სიტყვებს "სითბო", "ცეცხლოვანი ფრინველი"და "შემწვარი". და ფრჩხილების გარეშე ეს იქნებოდა მხოლოდ ცარიელი სტრიქონი, "ჩიტი" და "შემწვარი".

    "ამაღელვებელი" ქვე-საბლონი.ეს ნიშნავს, რომ თუ ქვესტრიქონი ემთხვევა შაბლონს, მაშინ ყველა შესატყვისი ბრუნდება შედეგად. სიცხადისთვის, მოვიყვანოთ მაგალითი. მოცემულია შემდეგი რეგულარული გამოთქმა: გამარჯვებული იღებს ((ოქროს|მოოქროვილი)(მედალი|თასი)) -და ხაზი შესატყვისების მოსაძებნად: "გამარჯვებული იღებს ოქროს მედალს". ორიგინალური ფრაზის გარდა, ძიების შედეგი დაბრუნდება: "ოქროს მედალი", "მედალი", "ოქრო".

გამეორების ოპერატორები (კვადრიფიკატორები)

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

გამეორებების აღსაწერად გამოიყენება კვადრიფიკატორები - მეტასიმბოლოები რაოდენობის დასაზუსტებლად. Quadrifiers ორი ტიპისაა:

  • ზოგადი, ჩასმული ფრჩხილებში;
  • შემოკლებული.

ზოგადი კვანტიფიკატორი განსაზღვრავს ელემენტის ნებადართული გამეორებების მინიმალურ და მაქსიმალურ რაოდენობას, რომელიც გამოიხატება როგორც ორი რიცხვი ხვეული ბრეკეტებში, როგორიცაა: x(2,5). თუ გამეორებების მაქსიმალური რაოდენობა უცნობია, მეორე არგუმენტი გამოტოვებულია: x(2,).

შორსმწერი რაოდენობები წარმოადგენს სიმბოლოებს ყველაზე გავრცელებული გამეორებისთვის, რათა თავიდან იქნას აცილებული არასაჭირო სინტაქსის არეულობა. ჩვეულებრივ გამოიყენება სამი აბრევიატურა:

1. * - ნული ან მეტი გამეორება, რაც უდრის (0,).

2. + - ერთი ან მეტი გამეორება, ანუ ,).

3. ? - ნული ან მხოლოდ ერთი გამეორება - (0,1).

რეგულარული გამოხატვის მაგალითები

მათთვის, ვინც სწავლობს რეგულარულ გამონათქვამებს, მაგალითები საუკეთესო სახელმძღვანელოა. ჩვენ წარმოგიდგენთ რამდენიმეს, რომლებიც აჩვენებენ თავიანთ ფართო შესაძლებლობებს მინიმალური ძალისხმევით. პროგრამის ყველა კოდი სრულად თავსებადია PHP ვერსიებთან 4.x და უფრო მაღალი. სინტაქსის სრულად გასაგებად და ენის ყველა მახასიათებლის გამოსაყენებლად გირჩევთ ჯ.ფრიდლის წიგნს “Regular Expressions”, რომელიც სრულად განიხილავს სინტაქსს და შეიცავს რეგულარული გამონათქვამების მაგალითებს არა მხოლოდ PHP-ში, არამედ Python, Perl, MySQL, Java, Ruby და C#.

ელ.ფოსტის მისამართის სისწორის შემოწმება

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

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

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

  1. @ სიმბოლოს არსებობა წყაროს სტრიქონში და სივრცეების არარსებობა.
  2. მისამართის დომენის ნაწილი, რომელსაც მოჰყვება @ სიმბოლო, შეიცავს მხოლოდ დომენის სახელების მოქმედ სიმბოლოებს. იგივე ეხება მომხმარებლის სახელს.
  3. მომხმარებლის სახელის შემოწმებისას, თქვენ უნდა მოძებნოთ სპეციალური სიმბოლოები, როგორიცაა აპოსტროფი ან ეს სიმბოლოები პოტენციურად საშიშია და შეიძლება გამოყენებულ იქნას შეტევებში, როგორიცაა SQL ინექცია. მოერიდეთ ასეთ მისამართებს.
  4. მომხმარებლის სახელები იძლევა მხოლოდ ერთ წერტილს, რომელიც არ შეიძლება იყოს ხაზის პირველი ან ბოლო სიმბოლო.
  5. დომენის სახელი უნდა შეიცავდეს მინიმუმ ორ და არაუმეტეს ექვს სიმბოლოს.

მაგალითი, რომელიც ითვალისწინებს ყველა ამ პირობას, შეგიძლიათ იხილოთ ქვემოთ მოცემულ ფიგურაში.

URL-ების მოქმედების შემოწმება

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

გამოსავალი.ჩვენი საბოლოო ვერსია ასე გამოიყურება:

/^(https?:\/\/)?([\da-z\.-]+)\.((2,6))([\/\w \.-]*)*\/?$ /

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

საკრედიტო ბარათის ნომრების შემოწმება

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

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

უნივერსალური გამონათქვამის დაწერა, რომელიც ითვალისწინებს შესაძლო სივრცეებსა და დეფისებს, უფრო რთულია, ვიდრე უბრალოდ რიცხვების გარდა ყველა სიმბოლოს გაუქმება. ამიტომ რეკომენდირებულია გამოსახულებაში გამოვიყენოთ /D მეტანიშანი, რომელიც შლის ყველა სიმბოლოს რიცხვების გარდა.

ახლა შეგიძლიათ პირდაპირ გააგრძელოთ ნომრის შემოწმება. ყველა საკრედიტო ბარათის კომპანია იყენებს უნიკალურ ნომრის ფორმატს. მაგალითში ეს გამოიყენება და კლიენტს არ სჭირდება კომპანიის სახელის შეყვანა - ეს განისაზღვრება ნომრით. Visa ბარათები ყოველთვის იწყება 4-ით და აქვს რიცხვის სიგრძე 13 ან 16 ციფრი. MasterCard იწყება 51-55 დიაპაზონში, რიცხვის სიგრძე 16. შედეგად, ჩვენ ვიღებთ შემდეგ გამონათქვამს:

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

ტელეფონის ნომრების შემოწმება

დავალება.შეყვანილი ტელეფონის ნომრის სისწორის შემოწმება.

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

+CCC.NNNNNNNNNNxEEEE,სად:

C არის ქვეყნის კოდი, რომელიც შედგება 1-3 ციფრისგან.

N - რიცხვი 14 ციფრამდე.

E - სურვილისამებრ გაფართოება.

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

შედეგად, ჩვენ გვაქვს შემდეგი გამოხატულება:

^\+(1,3)\.(4,14)(?:x.+)?$

ნომრები დიაპაზონში

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

გამოსავალი. აქ არის რამდენიმე გამონათქვამი რამდენიმე ყველაზე გავრცელებული შემთხვევისთვის:

IP მისამართის პოვნა

დავალება.თქვენ უნდა განსაზღვროთ არის თუ არა მოცემული სტრიქონი სწორი IP მისამართი IPv4 ფორმატში 000.000.000.000-255.255.255.255 დიაპაზონში.

გამოსავალი.როგორც PHP-ში ნებისმიერი დავალების შემთხვევაში, რეგულარულ გამონათქვამებს ბევრი ვარიაცია აქვთ. მაგალითად, ეს:

ონლაინ გამოხატვის შემოწმება

რეგულარული გამონათქვამების სისწორის ტესტირება შეიძლება რთული იყოს ახალი პროგრამისტებისთვის სინტაქსის სირთულის გამო, რომელიც განსხვავდება "ჩვეულებრივი" პროგრამირების ენებისგან. ამ პრობლემის გადასაჭრელად, არსებობს მრავალი ონლაინ გამოხატვის ტესტერი, რომელიც აადვილებს შექმნილი შაბლონის სისწორის შემოწმებას რეალურ ტექსტზე. პროგრამისტი შეაქვს შესამოწმებელ გამონათქვამს და მონაცემებს და მყისიერად ხედავს დამუშავების შედეგს. ჩვეულებრივ, ასევე არის საცნობარო განყოფილება, სადაც დეტალურად არის აღწერილი რეგულარული გამონათქვამები, მაგალითები და განხორციელების განსხვავებები ყველაზე გავრცელებული პროგრამირების ენებისთვის.

მაგრამ ონლაინ სერვისების შედეგების სრული ნდობა არ არის რეკომენდებული ყველა დეველოპერისთვის, რომელიც იყენებს PHP-ს. რეგულარული გამოთქმა, დაწერილი და პირადად გამოცდილი, აუმჯობესებს თქვენს უნარს და გარანტიას იძლევა შეცდომების არარსებობას.


PHP ენის ერთ-ერთი ძალიან ძლიერი და სასარგებლო თვისებაა მისი რეგულარული გამონათქვამების მხარდაჭერა. ბევრ პროგრამისტს, როგორც დამწყებს, ისე საკმაოდ გამოცდილს, აშინებს ჩვეულებრივი გამოხატვის ენის აშკარა სირთულე და სირთულე. მაგრამ შემიძლია დაგარწმუნოთ - ღირს. რეგულარული გამონათქვამების გამოყენება მნიშვნელოვნად ამარტივებს ტექსტების და სუსტ სტრუქტურირებული მონაცემების დამუშავების მუშაობას.


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


ვფიქრობ, არაერთხელ შეგხვედრიათ სიტუაციები, როდესაც გაქვთ ტექსტი (მაგალითად, Microsoft Word-ში) და მასში რაიმე მნიშვნელოვანი უნდა იპოვოთ. თუ იცით ზუსტად რას ეძებთ, ყველაფერი მარტივია: გამოიძახეთ საძიებო დიალოგი, შეიყვანეთ საძიებო სიტყვა, დააჭირეთ ღილაკს და voila - ნაპოვნია ტექსტი.


მაგრამ რას გააკეთებთ, თუ წინასწარ იცით მხოლოდ იმ ტიპის ინფორმაცია, რომელსაც ეძებთ? მაგალითად, თქვენ წინაშე დგას ამოცანა, იპოვოთ ყველა ელექტრონული ფოსტის მისამართი რამდენიმე ასეული ფურცლის დოკუმენტში. ზოგი დოკუმენტს ხელით ნახავს, ​​ზოგი ძაღლს (@) შეიყვანს ძიებაში და მოძებნის მას. ვეთანხმები - ორივე ვარიანტი არის უკუღმა, უმადური სამუშაო.

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

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

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

// წაკითხვადი სიმბოლოები a E // წაუკითხავი სიმბოლოები და კოდები \x41 - იგივე ასო "A" \x09 - ჩანართის სიმბოლო

პერსონაჟთა ჯგუფი არის რამდენიმე სიმბოლო, რომელიც იწერება თანმიმდევრობით:

Abvg ACZms

მსურს დაუყოვნებლივ გავამახვილო თქვენი ყურადღება - რეგულარულ გამონათქვამებში "სივრცე" ასევე განიხილება, როგორც მნიშვნელოვანი პერსონაჟი, ამიტომ ფრთხილად იყავით გამონათქვამების წერისას. მაგალითად, სიმბოლოთა ეს ჯგუფები არის სხვადასხვა გამონათქვამები:

ABC WHERE ABC სად

ენის შემდეგი ელემენტია მეტახასიათები. პრეფიქსი "მეტა" ნიშნავს, რომ ეს სიმბოლოები აღწერს ზოგიერთ სხვა სიმბოლოს ან მათ ჯგუფს. ცხრილი აღწერს რეგულარული გამოხატვის ენის ძირითად მეტახასიათებს:

მეტაგმირები სპეციალური სიმბოლოების მითითებისთვის
() ფრჩხილები. განსაზღვრავს წყობილ გამონათქვამებს.
| შერჩევის მეტაპერსონაჟი
^ ხაზის დასაწყისი მეტახასიათი
$ ხაზის ბოლოს მეტაპერსონაჟი
\n ხაზის არხის სიმბოლო (ექვსკუთხედი კოდი 0x0A)
\r ვაგონის დაბრუნების სიმბოლო (ექვსკუთხედი კოდი 0x0D)
\ ტ ჩანართის სიმბოლო (ექვსკუთხედი კოდი 0x09)
\ ჩხ სიმბოლოს ჩასმა თექვსმეტობითი კოდით 0xhh, მაგალითად, \x42 ჩასვამს ლათინურ ასოს "B"
მეტაგმირები სიმბოლოთა ჯგუფების მითითებისთვის
. Წერტილი. ნებისმიერი პერსონაჟი.
\ დ ციფრი (0-9)
\დ არა რიცხვი (ნებისმიერი სიმბოლო სიმბოლოების გარდა 0-9)
\ ს ცარიელი სიმბოლო (ჩვეულებრივ სივრცე და ჩანართი)
\ ს არა ცარიელი სიმბოლო (ყველა სიმბოლოების გარდა, რომლებიც იდენტიფიცირებულია \s მეტახასიათებით)
\w "ლექსიკონის" სიმბოლო (სიმბოლო, რომელიც გამოიყენება სიტყვებში. როგორც წესი, ყველა ასო, ყველა რიცხვი და ქვედა ხაზი ("_"))
\ვ ყველა სიმბოლოს გარდა, რომელიც განსაზღვრულია \w მეტანიშანით

ცხრილის მეორე ნახევრის მეტაპერსონაჟები ძალიან ადვილი დასამახსოვრებელია. "d" - ციფრი (ციფრი), "s" - სიმბოლო (სიმბოლო), "w" - სიტყვა (სიტყვა). თუ ასო დიდია, მაშინ თქვენ უნდა დაამატოთ "NOT" ჯგუფის აღწერაში.

მაგალითად ავიღოთ ტექსტი „წითელ მაისურს აქვს ნომრები 1812, ხოლო მწვანე მაისურს აქვს ნომრები 2009“. მოდით შევხედოთ უმარტივესი რეგულარული გამონათქვამების მაგალითებს:

\d\d\d\d - იპოვის 1812 და 2009 \D - იპოვის ყველა ასოს, სივრცეს და პუნქტუაციის ნიშანს \s - იპოვის ყველა სივრცეს ტექსტში.

მაგრამ ჩვენს მაგალითში წელი შეიძლება დაიწეროს არა ოთხში, არამედ ორციფრად, სიტყვებს შეიძლება ჰქონდეს სხვა დაქვეითება და ა.შ. სიმბოლოების ქვეჯგუფები, რომლებიც მითითებულია კვადრატული ფრჩხილების გამოყენებით, დაგეხმარებათ აქ:

ნიშნავს ნებისმიერ ციფრს (იგივე \d) - ნიშნავს ლუწი ციფრს - ნიშნავს ლათინური ანბანის ნებისმიერ სიმბოლოს (ნებისმიერ შემთხვევაში) ან ციფრს.

მაგალითად, გამოთქმა \d\d\d ტესტის სტრიქონში იპოვის მხოლოდ 1812-ს, მაგრამ არა 2009-ს. ეს გამოთქმა უნდა წაიკითხოს როგორც "იპოვე ოთხი ციფრის ყველა მიმდევრობა, სადაც ბოლო ციფრი არის 0,2,4,6 ან 8."

ყველაფერი, რაც ჩვენ დავრჩით, არის რაოდენობები და მოდიფიკატორები.

კვანტიფიკატორიარის სპეციალური კონსტრუქცია, რომელიც განსაზღვრავს რამდენჯერ უნდა გამოჩნდეს პერსონაჟი ან პერსონაჟების ჯგუფი. რაოდენობრივი მაჩვენებელი იწერება ხვეული ფრჩხილებში "()". შესაძლებელია ჩაწერის ორი ფორმატი: ზუსტი და დიაპაზონი. ზუსტიფორმატი ასე იწერება:

აქ X არის წინა სიმბოლო ან ჯგუფის გამეორების რაოდენობა. მაგალითად გამოთქმა

ჩაწერის მეორე ფორმა არის დიაპაზონი. ჩაწერილია როგორც

(X, Y) // ან (,Y) // ან (X,)

სადაც X არის მინიმალური და Y არის გამეორებების მაქსიმალური რაოდენობა. Მაგალითად:

იკითხება როგორც "ორი-ოთხი ციფრი დაწერილი თანმიმდევრობით." თუ რომელიმე საზღვარი არ არის მითითებული, მაშინ არანაირი შეზღუდვა არ არის გათვალისწინებული. Მაგალითად:

\w(3,) - სამი ან მეტი ასო. \d(,5) - რიცხვები საერთოდ არ არის, ან არის, მაგრამ არაუმეტეს ხუთი.

რაოდენობები შეიძლება გამოყენებულ იქნას როგორც ერთ სიმბოლოზე, ასევე ჯგუფზე:

[A-Yaa-ya](1,3)

ეს კონსტრუქცია ტექსტიდან შეარჩევს ერთი, ორი ან სამი ასოს ყველა რუსულ სიტყვას (მაგალითად, "ან", "არა", "მე", "მივდივარ" და ა.შ.)

ხვეული ბრეკეტების გარდა, არსებობს კიდევ სამი რაოდენობრივი მეტანიშანი: "*" (ვარსკვლავი), "+" (პლუს) და "?" (კითხვა). ისინი გამოიყენება იმ შემთხვევებში, როდესაც საჭირო გამეორებების მინიმალური და მაქსიმალური რაოდენობა წინასწარ უცნობია. მაგალითად, ელექტრონული ფოსტის მისამართების ძიებისას, წინასწარ ვერ გეტყვით, რამდენი სიმბოლო იქნება მომხმარებლის სახელში ("ძაღლამდე") და რამდენი იქნება დომენის სახელში ("ძაღლის" შემდეგ).

მეტანიშანი "*" იკითხება როგორც "ნებისმიერი თანხა ნულიდან ან მეტიდან", ე.ი. დიზაინი

განსაზღვრავს თანმიმდევრული ასოების ნებისმიერ რაოდენობას, მათ შორის მათ სრულ არარსებობას.

სიმბოლო "+" ვარსკვლავისგან განსხვავდება მხოლოდ იმით, რომ მოითხოვს მინიმუმ ერთ სიმბოლოს. იმათ. დიზაინი

შეესაბამება ნებისმიერ ციფრულ თანმიმდევრობას ერთი ან მეტი ციფრით.

სიმბოლო "?" შეესაბამება ერთი პერსონაჟის არარსებობას ან არსებობას. იმათ. დიზაინი

შეესაბამება ნებისმიერ ციფრულ თანმიმდევრობას ერთი ან ორი ციფრით.

აქ უნდა აღინიშნოს ანტიიფიკატორების "*" და "+" ისეთი მახასიათებელი, როგორიცაა სიხარბე. საქმე იმაშია, რომ ნაგულისხმევად ეს სიმბოლოები შეესაბამება სიმბოლოების ყველაზე დიდ თანმიმდევრობას. მაგალითად, სტრიქონისთვის „დედამ ჩარჩო გარეცხა“ გამოთქმა:

აირჩევს "mama soap ra", რაც გარკვეულწილად მოულოდნელია, რადგან ველოდით, რომ მივიღებდით "ma". ამ ქცევის შესაცვლელად გამოიყენეთ მეტანიშანი "?" (კითხვის ნიშანი) დაწერილი დაუყოვნებლივ კვანტიფიკატორის შემდეგ. ის ზღუდავს კვანტიფიკატორების „მადას“ და აიძულებს მათ დააბრუნონ პირველი მატჩი და არა ყველაზე გრძელი. ახლა შევცვალოთ წინა მაგალითი:

და მიიღეთ საჭირო შესატყვისი "მა".

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

მე რთავს რეგისტრის უგრძნობ რეჟიმს, ე.ი. დიდი და პატარა ასოები არ განსხვავდება გამოხატულებაში.
მიუთითებს, რომ საძიებო ტექსტი უნდა განიხილებოდეს, როგორც მრავალი სტრიქონისაგან შემდგარი. ნაგულისხმევად, რეგულარული გამოხატვის ძრავა ტექსტს განიხილავს, როგორც ერთ სტრიქონს, მიუხედავად იმისა, თუ რა არის ის სინამდვილეში. შესაბამისად, მეტანიშვნები „^“ და „$“ მიუთითებს მთელი ტექსტის დასაწყისსა და დასასრულს. თუ ეს მოდიფიკატორი მითითებულია, მაშინ ისინი მიუთითებენ, შესაბამისად, ტექსტის თითოეული ხაზის დასაწყისსა და დასასრულს.
ნაგულისხმევი მეტანიშანი არის "." არ შეიცავს ახალი ხაზის სიმბოლოს მის განმარტებაში. იმათ. მრავალსტრიქონიანი ტექსტისთვის გამოთქმა /.+/ დააბრუნებს მხოლოდ პირველ სტრიქონს და არა მთელ ტექსტს, როგორც მოსალოდნელი იყო. ამ მოდიფიკატორის მითითება მოხსნის ამ შეზღუდვას.
ნაგულისხმევად აქცევს ყველა რაოდენობრივ მეტანიშანს "არახარბს". ენის ზოგიერთ მოდიფიკაციაში (კერძოდ PHP-ში), "U"-ს ნაცვლად გამოიყენება სიმბოლო "g", რომელიც უფრო შეესაბამება მნიშვნელობას ("g" არის მოკლე ინგლისური "greedy", "greedy" ).

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

რეგულარული გამონათქვამები PHP-ში.

PHP-ში რეგულარულ გამონათქვამებთან მუშაობისთვის არსებობს სპეციალური ფუნქციები, რომელთა სია და მოკლე აღწერა მოცემულია ცხრილში:

int preg_match (სტრიქონის ნიმუში, სტრიქონის საგანი [, მასივის შესატყვისები])

ფუნქცია ამოწმებს ემთხვევა თუ არა საგნის შინაარსი ნიმუშის ნიმუშს. აბრუნებს 1-ს, თუ შესატყვისები მოიძებნება, წინააღმდეგ შემთხვევაში აბრუნებს 0-ს. თუ თქვენ მიუთითებთ არჩევით შესატყვისების მასივის პარამეტრს, მაშინ როდესაც ფუნქცია შესრულდება, მასში შეიტანება ერთი ელემენტი - ნაპოვნი პირველი შესატყვისი.

"; print_r($found); ?>

int preg_match_all (სტრიქონის ნიმუში, სტრიქონის თემა, მასივის შესატყვისი [, int თანმიმდევრობა])
ფუნქცია წინას იდენტურია, ერთადერთი განსხვავებით - ის ეძებს მთელ ტექსტს და აბრუნებს მატჩების მასივში ნაპოვნი ყველა შესატყვისს.
შერეული preg_replace (შერეული ნიმუში, შერეული ჩანაცვლება, შერეული თემა [, int ლიმიტი])
ორივე მისი წინამორბედი ფუნქციის მსგავსად, preg_replace ეძებს ტექსტის ნაწილს, რომელიც ემთხვევა შაბლონს. ფუნქცია ცვლის ყველა ნაპოვნი ფრაგმენტს პარამეტრებში მითითებული ტექსტით.გაწმენდის წინ:\n$text\n\n"; $text = preg_replace("/(\n \s(2,))/"," ",$text); echo " გაწმენდის შემდეგ:\n$text"; // გამოჩნდება სპეციალური სიმბოლოებისგან გასუფთავებული ტექსტი // და დამატებითი სივრცეები?>
შერეული preg_replace_callback (შერეული ნიმუში, შერეული გამოძახება, შერეული თემა [, int limit])
ფუნქცია წინას გაფართოებული ვერსიაა. მთავარი განსხვავება ისაა, რომ ამ ფუნქციას გადაეცემა პარამეტრებში ფუნქციის სახელი, რომელიც გაანალიზებს ტექსტს და გამოიმუშავებს ჩანაცვლებულ ტექსტს.
მასივი preg_split (სტრიქონის ნიმუში, სტრიქონის თემა [, int ლიმიტი [, int flags]])
ეს ფუნქცია ჰგავს explode() და split() ფუნქციებს. მისი თავისებურება ის არის, რომ გამყოფი არ არის ფიქსირებული სტრიქონი, არამედ რეგულარული გამოხატულება. ფუნქცია ყოფს წყაროს მონაცემებს ელემენტებად და ათავსებს მათ გამომავალ მასივში.
მასივი preg_grep (სტრიქონის ნიმუში, მასივის შეყვანა)
ფუნქცია შექმნილია მასივებში რეგულარული ძიებისთვის. ძიებისთვის მითითებულია შაბლონი და შეყვანის მონაცემების მასივი და ბრუნდება მასივი, რომელიც შედგება მხოლოდ შაბლონის შესაბამისი ელემენტებისაგან.

განხილული ფუნქციების ჩამონათვალი შორს არის სრულისგან, მაგრამ საკმაოდ საკმარისია რეგულარულ გამონათქვამებთან მუშაობის წარმატებით დასაწყებად. თუ გაინტერესებთ ეს თემა, აუცილებლად წაიკითხეთ დამატებითი ლიტერატურა (მაგალითად, ფრიდლის წიგნი „რეგულარული გამონათქვამები“). გარდა ამისა, სასწავლო მიზნებისთვის, გირჩევთ დააინსტალიროთ ერთ-ერთი სპეციალური პროგრამა რეგულარული გამონათქვამების შესამოწმებლად (მაგალითად, "PCRE" ან "RegEx Builder").

1.6K

რეგულარული გამონათქვამები (შემოკლებით რეგექსი) არის სიმბოლოების თანმიმდევრობა, რომლებიც ქმნიან საძიებო ნიმუშებს. ისინი ძირითადად გამოიყენება სტრიქონების შესატყვის ნიმუშებში.

Მოკლე ისტორია

  • ყველაფერი დაიწყო 1940-1960-იან წლებში, როდესაც ბევრი ჭკვიანი ადამიანი საუბრობდა რეგულარულ გამონათქვამებზე;
  • 1970-იანი წლები გ/რე/პ;
  • 1980 პერლი და ჰენრი სპენსერი;
  • 1997 PCRE (Perl Compatible Regular Expressions). სწორედ ამ დროს დაიწყო აღზევება, რასაც ჩვენ რეგულარულ გამონათქვამებს ვუწოდებთ. PCRE უზრუნველყოფს ბიბლიოთეკებს თითქმის ყველა ენაზე.

რეგულარული გამონათქვამების ზოგადი გამოყენება PHP-ში

PHP მოიცავს სამ ძირითად ფუნქციას PCRE-სთან მუშაობისთვის - preg_match, preg_match_all და preg_replace.

შესაბამისობის შედარება

გამოთქმა აბრუნებს 1-ს, თუ დამთხვევა მოხდა, 0-ს, თუ არა, და false-ს, თუ შეცდომა მოხდება:

int preg_match (სტრიქონი $pattern, string $subject [, მასივი &$ matches [, int $flags = 0 [, int $offset = 0 ]]])

რეგულარული გამოხატვის მაგალითი, რომელიც აბრუნებს ნაპოვნი შესატყვისობების რაოდენობას:

int preg_match_all (სტრიქონი $pattern, string $subject [, მასივი &$ matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]])

ჩანაცვლება

გამოთქმა აბრუნებს შეცვლილ სტრიქონს ან მასივს ( $subject-ზე დაყრდნობით):

შერეული preg_replace (შერეული $pattern, შერეული $ჩანაცვლება, შერეული $subject [, int $limit = -1 [, int $count ]])

რეგულარული გამონათქვამების ზოგადი გამოყენება JavaScript-ში

JavaScript-ში რეგულარული გამონათქვამები თითქმის იგივეა, რაც PHP-ში.

შესაბამისობის შედარება

აბრუნებს შესატყვისთა მასივს ან ნულს, თუ შესატყვისები არ არის ნაპოვნი:

string.match(RegExp);

ჩანაცვლება

რეგულარული გამოხატულება, რომელიც აბრუნებს სტრიქონს შესრულებული ჩანაცვლებით:

string.replace (RegExp, ჩანაცვლება);

რეგულარული გამონათქვამების მახასიათებლები JavaScript-ში

  • წერტილი არასოდეს ემთხვევა ახალ ხაზს:
  • მატჩისა და ჩანაცვლების შედარების იგივე მეთოდები რეგულარული გამოხატვის საშუალებით, როგორც მათ გარეშე.

რეგულარული გამოხატვის ნიმუშების შედგენის პრინციპები

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

ანალოგური სოკეტები

რეგულარული გამონათქვამები შედგება ორი ტიპის სიმბოლოსგან:

  • სპეციალური სიმბოლოები: ? * + () () ^ $ / .
  • ლიტერალები.

წარმოიდგინეთ შეყვანის სტრიქონები, როგორც ჭანჭიკები, ხოლო შაბლონი, როგორც მათთვის დამაკავშირებელთა ნაკრები (შესაბამისი თანმიმდევრობით).

სპეციალური სიმბოლოები

რეგულარული გამონათქვამების ტესტირებისას, თქვენ უნდა იცოდეთ როგორ მუშაობს სპეციალური სიმბოლოები:

  • უკუ დახაზულ სიმბოლოს \ შეუძლია შეცვალოს სხვა სპეციალური სიმბოლო რეგულარულ გამონათქვამში:
  • წერტილი და w - .

შეუთავსეთ ყველა სიმბოლო ახალი ხაზების გარდა. თუ გსურთ შეამოწმოთ შესაბამისობა წერტილთან და მხოლოდ წერტილთან - , ასოებთან, რიცხვებთან და ხაზებთან შესაბამისობისთვის - w

  • კვადრატული ფრჩხილები.

შეუთავსეთ სიმბოლოები ფრჩხილებში. მხარს უჭერს დიაპაზონებს. Რამდენიმე მაგალითი:
o - ემთხვევა ნებისმიერ a, b ან c.
o დიდი ასოები.
o ნებისმიერი ნომერი.
o - შეესაბამება ნებისმიერ მცირე ან დიდ ანბანურ სიმბოლოს.
სურვილისამებრ? ემთხვევა 0 ან 1.
ვარსკვლავი *.

ვარსკვლავი აღნიშნავს 0 ან მეტ სიმბოლოს.

შეუთავსეთ 1 ან მეტი სიმბოლო.

Ფიგურული ფრჩხილები ().

მინიმალური და მაქსიმალური მნიშვნელობები. რეგულარული გამოხატვის სინტაქსის რამდენიმე მაგალითი:
o (1,) არანაკლებ 1.
o (1,3) 1-დან 3-მდე.
o (1.64) 1-დან 64-მდე.

მოდით დავამატოთ ეს ყველაფერი, რომ მივიღოთ რეგულარული გამოხატულება ელ.ფოსტის მისამართებისთვის:

/+@+(.+)*/i


ასე გამოიყურება PHP-ში:

preg_match_all("/+@+(.+)*/i", $input_lines, $output_array);

რეგულარული გამოხატვის გამოყენება ვალიდაციისთვის

გამოწვევა: დარწმუნდით, რომ შეყვანის მონაცემები არის ის, რასაც ჩვენ ველით. მიზანი 1: /[^w$.]/ მიზანი 2: /^(1,2)$/

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

როდის არ უნდა გამოიყენოთ რეგულარული გამოხატულება დასადასტურებლად?

ბევრი შემთხვევა უკეთესია PHP filter_var ფუნქციის გამოყენებით. მაგალითად, ელექტრონული ფოსტის მისამართის დადასტურება უნდა მოხდეს PHP-ის ჩაშენებული ფილტრების გამოყენებით:

filter_var (" [ელფოსტა დაცულია]", FILTER_VALIDATE_EMAIL)

ვალიდაცია რეგულარული გამონათქვამების გამოყენებით

რეგულარული გამონათქვამები ხაზის ბოლოს იყენებენ წამყვანებს:

^ - მიუთითებს ხაზის დასაწყისზე.
$ არის დოლარის ნიშანი, რომელიც მიუთითებს ხაზის დასასრულს.

if (!preg_match("%^(1,2)$%", $_POST["გამოწერის_სიხშირე"])) ($isError = true; )

გამორიცხული პერსონაჟების კლასები

[^abc] - ყველაფერი a, b ან c გარდა, ახალი ხაზების ჩათვლით.

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

if (preg_match("/[^0-9a-z-_.]/i", $productCode)) ($isError = true; )

მოძებნეთ და შეცვალეთ

ყველაზე გავრცელებული PCRE ფუნქციები მოძიებისა და ჩანაცვლების შესასრულებლად არის preg_replace() და preg_replace_callback(). მაგრამ ასევე არის preg_filter() და preg_replace_callback_array(), რომლებიც თითქმის იგივეს აკეთებენ. გთხოვთ გაითვალისწინოთ, რომ preg_replace_callback_array() ფუნქცია ხელმისაწვდომია PHP7-დან.

შეცვალეთ სიტყვები სიაში

$subject = "მინდა ვაშლის ჭამა."; echo preg_replace("/ვაშლი|ბანანი|ფორთოხალი/", "ხილი", $subject);

შედეგი

ხილის ჭამა მინდა.

თუ რეგულარულ გამონათქვამს აქვს ქვენიმუშები ( ფრჩხილებში), შეგიძლიათ შეცვალოთ $N ან N (სად N არის მთელი რიცხვი >= 1), ამას ჰქვია "backlink".

ორი ნომრის გადაწყობა

$subject = "7/11"; echo preg_replace("/(d+)/(d+)/", "$2/$1", $subject);

შედეგი

შეცვალეთ თარიღის ფორმატირება

$subject = "2001-09-11"; echo preg_replace("/(d+)-(d+)-(d+)/", "$3/$2/$1", $subject);

შედეგი

URL-ის ჩანაცვლების მარტივი მაგალითი ტეგში

$subject = "გთხოვთ ეწვიოთ https://php.earth/doc დამატებითი სტატიებისთვის."; echo preg_replace("#(https?://([^s./]+(?:.[^s./]+)*[^s]*))#i", "$2", $subject) ;

შედეგი