Кілька прикладів регулярних виразів

По темі:


Чи є рядок числом, довжиною до 77 цифр:

  if (ereg ( "^ [0-9] {1,77} $", $ string)) echo "yes";  else echo "no"; 

Чи полягає рядок тільки з букв, цифр і "_", довжиною від 5 до 20 символів:

  if (ereg ( "^ [a-zа-я0-9 _] {5,20} $", $ string)) echo "yes";  else echo "no"; 

Чи є в рядку будь-які символи, крім допустимих. Допустимими вважаються літери, цифри і "_". Довжину тут перевіряти не можна, хіба що просто додатковою умовою strlen ($ string). Не плутайте з попереднім прикладом - хоч результат і однаковий, але метод інший, "від противного"

  if (! ereg ( "[^ a-zа-я0-9 _]", $ string)) 
  echo "немає сторонніх букв (OK)"; 
 else 
  echo "є сторонні літери (FALSE)"; 

Для регістро незалежного порівняння використовуйте ereg i ().

Чи є в рядку йдуть підряд символи, не менше 3-х символів поспіль (типу "абвгДДДеё", але не "ааббаабб"):

  if (preg_match ( "/ (.) \\ 1 \\ 1 /", $ string)) echo "yes";  else echo "no"; 

Замінити всюди в тексті СТРОКУ1 на СТРОКУ2 (завдання вирішується без регегулярних виразів):

  $ String = str_replace ( "рядок1", "рядок2", $ string); 

Замінити криві коди переходу рядка на нормальні: для цього потрібно тільки видалити "\ r".

Переходи бувають нормальними (але різними!): "\ N" або "\ r \ n".

Ще бувають глюки, типу "\ r \ r \ n".

  $ String = str_replace ( "\ r", "", $ string); 

Замінити всі повторювані прогалини на один. Не намагайтеся тут застосувати str_replace, це хороша функція, але не для даного прикладу.

  $ String = preg_replace ( "/ ХХ + /", "Х", $ string);  // Замість Х поставте пробіл 

У тексті є деякі слова, припустимо "СЛОВО" і "Ляляля" (і т.д.), які потрібно однаковим чином замінити на те ж саме, але з добавками.

Можливо, слова відсутні або зустрічаються багато разів в будь-якому регістрі.

Тобто якщо було "слово" або "Слово" (або ще як), потрібно замінити це на "<b> слово </ b>" або "<b> слова </ b>" (дивлячись, як було).

Іншими словами потрібно знайти перелік слів в будь-якому регістрі і вставити по краях найленних слів фіксовані рядки (на "<b>" і "</ b>").

  $ string = preg_replace ( "/ (слово1 | слово2 | ляляля | слово99) / si", "\\ 1", $ string); 

Знайти текст, укладений в якийсь тег, наприклад <TITLE> ... </ TITLE> з HTML-файлу ($ string - вихідний текст).

  if (preg_match ( "!  (. *?)  ! Si ", $ string, $ ok))
  echo "Тег знайдений, текст: $ ok [1]";
 else
  echo "Тег не найден"; 

Знайти текст, укладений в якийсь тег і замінити його на інший тег, наприклад: <TITLE> ... </ TITLE> замінити аналогічно на <МОЙ_ТЕГ> ... </ МОЙ_ТЕГ> в HTML-файлі:

  preg_replace ( "! ! Si "," <МОЙ_ТЕГ> \\ 1 МОЙ_ТЕГ>  ", $ String); 

Підсвічування PHP-коду в повідомленнях

Наприклад, у вас є форум типу vBulletin, де можна підсвічувати код, якщо його виділити спеціально: [PHP] будь-який код [/ PHP].

У підсумку, після цього (при перегляді повідомлення), виходить гарний і кольоровий php-код.

І так, якщо ви хочете, щоб всі шматки між [PHP] .. [/ PHP] і <? ..?> Сприймалися як код і раскрашивались, то це можна зробити досить легко.

Текст програми.

 <?

 // вихідне повідомлення:
 // ------------------------------------------------ ------
 $ Str = '
 Памагите, нічаво не працює!  Ось приклад:
 [Php]
 // comment
 # comment
 phpinfo ();
 [/ Php] 

 ля ля ля ля ля ля 

 [Php]
 for ($ i = 0; $ i <100; $ i ++) {
 ping ( "- f", "www.ru");
 }
 [/ Php]
 <? 
 echo "<a href=http://shram.kiev.ua/> click here! </a>";
 phpinfo (); 
 ?>
 ';
 // ------------------------------------------------ ------

 // Придушити попередження (в highlight_string є глюки) 
 error_reporting (0);

 // Функція підсвічування одного шматка тексту
 function _my _ ($ s, $ a1, $ a2) {
  if ($ a1! = "<?") {$ a1 = "<?";  $ A2 = "?>";  }
  $ S = str_replace ( "\\\" "," \ "", $ s);
  ob_start ();
  highlight_string ($ a1. $ s. $ a2);
  $ S = ob_get_contents ();
  ob_end_clean (); 
  return $ s;
 }

 // Шукаємо в тексті все шматки між <? ... Або [PHP] ...
 $ Str = preg_replace ( "! (\ [Php \] | <\?) (. *?) (\ [/ Php \] | \?>)! Ise", "_ my _ ( '\\ 2', '\ \ 1 ',' \\ 3 ') ", $ str);

 echo $ str;

 ?>

Після такої програми на екрані виходить:

Памагите, нічаво не працює! Ось приклад: <?
// comment
# comment
phpinfo ();
?> Ляляля ляляля <?
for ($ i = 0; $ i <100; $ i ++) {
ping ( "-f", "www.ru");
}
?> <?
echo "<a href=http://shram.kiev.ua/> click here! </a>";
phpinfo ();
?>

Як видно, все, що було між спец.строкамі підсвітити, а сторонній текст ніяк не змінився. Якщо ви збираєтеся застосовувати для форуму, то подумайте і про переходах на нові рядки.

Якщо у вас все повідомлення - це суцільний код, то використовуйте highlight_string безпосередньо, без пошуку <? ..?> В коді ...

Перевірка URL на коректність

Це функція взята з вихідних чату.

Підтримує всі, що тільки може бути в УРЛ ...

Пам'ятайте про те, що ви повинні не тільки перевіряти, а й приймати нове значення

від функції, тому що та дописує "http: //" в разі його відсутності.

  // Доп.  функція для видалення небезпечних сиволов
 function pregtrim ($ str) {
  return preg_replace ( "/ [^ \ x20- \ xFF] /", "", @ strval ($ str));
 }
 //
 // Перевіряє URL і повертає:
 // * +1, Якщо URL порожній 
 // If (checkurl ($ url) == 1) echo "порожньо"
 // * -1, Якщо URL-адреса не порожній, але з помилками
 // If (checkurl ($ url) == - 1) echo "помилка"
 // * Рядок (новий URL), якщо URL знайдений і отпарсен
 // If (checkurl ($ url) == 0) echo "все ок"
 // Або if (strlen (checkurl ($ url))> 1) echo "все ок"
 //
 // Якщо протоколу не було в URL, він буде доданий ( "http: //")
 //
 function checkurl ($ url) {
  // Ріжемо ліві символи і крайні прогалини
  $ Url = trim (pregtrim ($ url));
  // Якщо порожньо - вихід
  if (strlen ($ url) == 0) return 1;
  // Перевіряємо УРЛ на правильність
  if (! preg_match ( "~ ^ (? :( ?: Https? | Ftp | telnet): // (?: [A-z0-9_-] {1,32} ".
  "(? :: [A-z0-9 _-] {1,32})? @)?)? (? :( ?: [A-z0-9 -] {1,128} \.) + (?: Com | net | ".
  "Org | mil | edu | arpa | gov | biz | info | aero | inc | name | [az] {2}) | (?! 0) (? :( ? ".
  "! 0 [^.] | 255) [0-9] {1,3} \.) {3} (?! 0 | 255) [0-9] {1,3}) (?: / [A -z0-9., _ @% & ".
  "? + = \ ~ / -] *)? (?: # [^ '\" & <>] *)? $ ~ I ", $ url, $ ok))
  return -1;  // Якщо не правильно - вихід
  // Якщо немає протокала - додати
  if (! strstr ($ url, ": //")) $ url = "http: //". $ url;
  // Замінити протокол на нижній регістр: hTtP -> http
  $ Url = preg_replace ( "~ ^ [az] + ~ ie", "strtolower ( '\\ 0')", $ url);
  return $ url;
 } 

Таким чином для перевірки потрібно використовувати щось таке:

  $ Url = checkurl ($ url);  // Перезаписали УРЛ в самого себе
 if ($ url) exit ( "Помилковий URL"); 

Перевірка правильності E-mail

Перевірка правильності E-mail - перевіряти аналогічно до попереднього прикладу.

  //
 // Перевіряє мило і повертає
 // * +1, Якщо мило порожнє
 // * -1, Якщо не порожнє, але з помилкою
 // * Рядок, якщо мило вірне
 //

 function checkmail ($ mail) {
  // Ріжемо ліві символи і крайні прогалини
  $ Mail = trim (pregtrim ($ mail));  // Функцію pregtrim () візьміть вище в прикладі
  // Якщо порожньо - вихід
  if (strlen ($ mail) == 0) return 1;
  if (! preg_match ( "/ ^ [a-z0-9 _-] {1,20} @ (([a-z0-9 -] + \.) + (com | net | org | mil |".
  "Edu | gov | arpa | info | biz | inc | name | [az] {2}) | [0-9] {1,3} \. [0-9] {1,3} \. [0- ".
  "9] {1,3} \. [0-9] {1,3}) $ / is", $ mail))
  return -1;
  return $ mail;
 } 

Вирізання URL з тексту і кривих HTML-файлів

Іноді потрібно вирізати з HTML-текст посилання на URL або Email.

Якщо у вас в HTML немає свідомо кривого коду, то це дуже просте завдання на регулярний вираз типу:

  ] + Href = ([^>] +) [^>] *> (. *?) 

Але посилання бувають різні ... Як робити вашу програму, вирішувати вам.

Можна брати тільки 100% вірні посилання, але тоді деякі криві ссликой не потраплять (хоча вони теж вірні).

Можна брати все підряд, але тоді деякі посилання будуть не зовсім коректно вирізатися.

Текст програми:

  <?
 $ Str = "
 <a href=url1> name1 </a> 
 <a href=url2> name2 </a>
 <a href='url3'> name3 </a> 
 <a href=url4> <дужки> </a>
 <a href=\"url5\"> <b> жирно </ b> </a> 
 <a href=url6> \ "лапки \" </a>
 <a target=\"<попитка обхитрити программу> хахаха \ "href = url7> 77777 </a>
 <a href=url8 target=\"<попитка обхитрити программу> хахаха \ "> 88888 </a>";
 echo "<pre> Вихідний код:". htmlspecialchars ($ str). "</ pre>";
 echo "--------------- Варіант 1 ---------------";
 preg_match_all ( "!  ] +) \ "? '?. *?> (. *?)! Is", $ str, $ ok);
 for ($ i = 0; $ i  ". $ Ok [1] [$ i]."  - ". $ Ok [2] [$ i];
 }
 echo " 
---------------Варіант 2---------------"; preg_match_all ( "! ] + href = \ "? '? ([^ \"'>] +) \ "? '? [^>] *> (. *?)! is", $ str, $ ok); for ($ i = 0; $ i ". $ Ok [1] [$ i]." - ". $ Ok [2] [$ i]; } echo "
--------------- Варіант 3 --------------- "; preg_match_all ( "!
] + href = \ "? '? ([^ \"'>] +) \ "? '? [^>] *> ([^ <>] *?)! is", $ str, $ ok); for ($ i = 0; $ i ". $ Ok [1] [$ i]." - ". $ Ok [2] [$ i]; } ?>

Результат виконання прикладу:

Вихідний код:
<a href=url1> name1 </a>
<a href=url2> name2 </a>
<a href='url3'> name3 </a>
<a href=url4> <дужки> </a>
<a href="url5"> <b> жирно </ b> </a>
<a href=url6> "лапки" </a>
<a target="<попитка обхитрити программу> хахаха "href = url7> 77777 </a>
<a href=url8 target="<попитка обхитрити программу> хахаха "> 88888 </a>
---------------Варіант 1---------------
  • url1 - name1
  • url2 - name2
  • url3 - name3
  • url4 - <дужки>
  • url5 - жирно
  • url6 - "лапки"
  • url7 - 77777
  • url8 - хахаха "> 88888
    ---------------Варіант 2---------------
  • url1 - name1
  • url2 - name2
  • url3 - name3
  • url4 - <дужки>
  • url5 - жирно
  • url6 - "лапки"
  • url8 - хахаха "> 88888
    --------------- Варіант 3 ---------------
  • url1 - name1
  • url2 - name2
  • url3 - name3
  • url6 - "лапки"