Кілька прикладів регулярних виразів
Чи є рядок числом, довжиною до 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 --------------- |

Коментарі
Коментуючи, пам'ятайте про те, що зміст і тон Вашого повідомлення можуть зачіпати почуття реальних людей, проявляйте повагу та толерантність до своїх співрозмовників навіть у тому випадку, якщо Ви не поділяєте їхню думку, Ваша поведінка за умов свободи висловлювань та анонімності, наданих інтернетом, змінює не тільки віртуальний, але й реальний світ. Всі коменти приховані з індексу, спам контролюється.