Кілька прикладів регулярних виразів
Чи є рядок числом, довжиною до 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--------------- ---------------Варіант 2--------------- --------------- Варіант 3 --------------- |
Коментарі
Коментуючи, пам'ятайте про те, що зміст і тон Вашого повідомлення можуть зачіпати почуття реальних людей, проявляйте повагу та толерантність до своїх співрозмовників навіть у тому випадку, якщо Ви не поділяєте їхню думку, Ваша поведінка за умов свободи висловлювань та анонімності, наданих інтернетом, змінює не тільки віртуальний, але й реальний світ. Всі коменти приховані з індексу, спам контролюється.