КОнтакты, предложения, отзывы

.rar или .zip
Вложение
Онлайн-чат
На этом сайте, вы найдёте полезную информацию, практические советы в области веб-программирования, веб-дизайна и веб-разработок в целом. Мы с удовольствием поделимся с вами реальными примерами и решениями задач, связанных с jQuery , JavaScript , PHP и MySQL , версткой сайтов , поможем разобраться новичкам с современными технологиями, такими как Ajax , HTML5 , CSS3 и многими другими.

Регулярные возражения

Сводная таблица метасимволов

/ Начало и конец регулярного выражения
. Соответствует любому одному символу, кроме символа новой строки
Элемент* Соответствует появлению элемента от нуля и более раз
Элемент+ Соответствует появлению элемента от одного и более раз
Элемент? Соответствует появлению элемента от нуля до одного раза
? Делает поиск "нежадным" что позволяет искать самое короткое вхождение, например .*?
[abc] Соответствует одному из тех символов , которые содержатся в квадратных скобках
[^abc] Соответствует одному из тех символов , которые не содержатся в квадратных скобках
(regex) Рассматривает regex как группу для вычисления или длрассмотрения с одним из следующих метасимволов: *, + или ?
левое|правое Соответствует либо левому , либо правому
[i-r] Соответствует диапазону символов между i и r
^ или \A в PHP Требует, чтобы соответствие было в начале строки
$ или \Z в PHP Требует чтобы соответствие было в конце строки. Правильное решение - использовать утверждение \z. Когда нам нужно получить в результате строку без "разделителей строк", $ не должен использоваться.
\b Соответствует границе слова
\B Соответствует при отсутствии границы слова
\d Соответствует одной цифре
\D Соответствует одному символу, не являющемуся цифрой
\n Соответствует символу новой строки
\s Все "недосимволы" - пробелы, переводы строки, табуляция ([ \t\n\r\f\v])
\S Все НЕ "недосимволы" ([^ \t\n\r\f\v])
\t Символ табуляции
\w Символы, используемые в словах (a-z, A-Z, 0-9 и _)
\W Символы, не используемые в словах (всё кроме a-z, A-Z, 0-9 и _)
\x Соответствует x (применяется, если х является метасимволом, но нужет символ х как таковой
{n} Соответствует в точности n появлениям
{n,} Соответствует n и более появлениям
{min, max} Соответствует как минимум min и как максимум max появлениям
(?=) вперёд смотрящее утверждение, например нужно найти все слова, за которым следует слово and - /\b\w+?\b(?=[\s,]*?and)/gi , само слово and не мэтчится
(?!) вперёд смотрящее отрицание, например нужно найти все слова, за которыми НЕ следует слово and - /\b\w+?\b(?! and)/gi , само слово and не мэтчится

Общие модификаторы

В регулярных выражениях можно применять следующие модификаторы :
/g — допускает «глобальное» соответствие. Этот модификатор применяется в javascript с функцией замены , что позволяет выполнить замену во всех соответствующих местах, а не только в месте первого соответствия. В ПХП не применяется ввиду крайней сложности в использовании
/i — отключает в регулярном выражении чувствительность к регистру букв. То есть вместо /[a- zA- Z]/ можно указать / [a- z]/i или /[A- Z]/i;
/U — Если указать данный модификатор, то будет вестись поиск минимального по длине соответствия. По умолчанию же ищется максимальное по длине соответствие.
/m — допускает многострочный режим работы , в котором знак вставки (^) и знак доллара ($) соответствуют позициям перед любыми символами новой строки в сравниваемой строковой переменной и после них. Обычно при поиске соответствия в многострочной строковой переменной знак ^ соответствует только позиции в ее начале, а символ $ — в ее конце.
/s — Противоположность модификатору m, то есть, указав данный модификатор, соответствие будет искаться по всему тексту
/x — При использовании данного модификатора пробельные символы будут игнорироваться. То есть Вы можете написать хоть 100 пробелов, и они будут опущены. Если, конечно, Вы их не экранируете (с помощью "\" ).
/u — Позволяет работать с юникодом.
$str = 'Решил провести маленький';
echo preg_match('/\bМаленький\b/iu', $str);

Использование регулярных выражений в JavaScript

В JavaScript регулярные выражения используются в основном в двух методах: test и replace. Метод test просто сообщает, соответствует ли его аргумент регулярному выражению, а метод replасе воспринимает второй параметр — строку, которой заменяется текст, соответствующий регулярному выражению. Как и большинство методов, replace генерирует в качестве возвращаемого значения новую строку, входные данные при этом не изменяются. Если сравнивать эти два метода, то следующая инструкция просто возвращает true, позволяя узнать, что слово cats появляется в строке хотя бы один раз:
document.write(/cats/i.test("Cats are fun. I like cats.")); 
А следующая инструкция заменяет оба имеющихся слова cats словом dogs, выводя результат на экран. Поиск должен быть глобальным (/g), чтобы найти все экземпляры этого слова, и нечувствительным к регистру букв (/i), чтобы найти слова, начинающиеся с большой буквы (Cats):
document.write('Cats are fun. I like cats.'.replace(/cats/gi,"dogs"));
Если испытать эту инструкцию в работе, то проявятся ограничения функции замены : поскольку текст заменяется строго той строкой , которую предписано использовать, первое слово Cats заменяется словом dogs, а не словом Dogs.

Методы класса RegExp

var pattern = /\w+/ig,
    string = "How we survive is what makes us who we are";
console.log(string.match(pattern)); // если стоит флаг global, возвращает массив всех мэтчей, иначе обьект, в котором содержится  найденное совпадение, индекс вхождения index и сама строка input
console.log(string.search(pattern)); // действует подобно match, но игнорирует флаг g и всегда возвращает индекс первого мэтча или -1
console.log(string.split(/[\s,]+/)); // разбивает строку в массив по рег.выражению
/* метод replace */
var input = document.getElementsByClassName('input')[0],
output = document.getElementsByClassName('output')[0];
input.addEventListener('keyup', function(){
   output.innerHTML = this.value.replace(
   /\{\((\w+)\)\}/gi, '$1' // содержимое сохраняющих групп в переменные
   );
   // также можно передавать функцию, которая вернёт замещающую строку
   /*
    /\{\((\w+)\)\}/gi, function(match, value, [value1], и т.д.){
       // первый аргумент = всё вхождение, следующие  = содержимое запоминающих групп
        return value;// вернёт содержимое первой группы, match - всю совпавшую строку
    }
   */
}, false);
     
var pattern2 = /\w+@\w+\.\w+/ig,
string2 = "Living in ilikeitalls@mail.ru";       
console.log(pattern.test(string));
console.log(pattern.lastIndex);
console.log(pattern.test(string)); // вернёт уже false, т.к. при флаге g lastIndex обновляется

// метод exec, удобно использовать в цикле, т.к. lastIndex обновляется
while(match = pattern.exec(string)){
  console.log(match[0] + '(index: ' + match.index + ')');
  // match[1], match[2] - cодержимое групп
}

Использование регулярных выражений в РНР

В РНР наиболее часто используются следующие функции, в которых применяются регулярные выражения: preg_match, preg_match_all и preg_replасе. Чтобы проверить присутствие слова cats в любом месте строки, в любой комбинации букв в нижнем и верхнем регистрах, можно воспользоваться функцией preg_match:
$n = preg_match('/cats/i',  "Cats are fun. I like cats.");
Поскольку в PHP используется значение 1 для TRUE и значение 0 для FALSE, предыдущая инструкция присвоит переменной $п значение 1. Первым аргументом функции служит регулярное выражение, а вторым — текст, проверяемый на соответствие. Но функция preg_match способна выполнять более сложную задачу, поскольку она воспринимает еще и третий аргумент, который показывает, какой именно текст соответствовал регулярному выражению:
$n = preg_match('/cats/i', "Cats are fun. I like cats.", $match);
echo "Количество соответсвий $n: $match[0]";
Третий аргумент является массивом (здесь ему присвоено имя $match). Функция помещает текст, соответствующий регулярному выражению, в первый элемент массива, поэтому, если соответствие будет найдено, то соответствующий регулярному выражению текст может быть найден в элементе $match[0]. Если нужно определить все соответствия, используется функция preg_match_all:
$n = preg_match_all('/ cats/i', "Cats are fun. I like cats.", $match);
echo "Количество соответствий $n: ":
for ($j=0; $j < $n; ++$j) echo $match[0][$j].";
Как и в предыдущем случае, функции передан массив $match и элементу $match[0] присваиваются найденные соответствия, только теперь они представляют собой подмассив. Для отображения содержимого подмассива в этом примере осуществляется последовательный перебор его элементов с помощью цикла for.
Если нужно заменить часть строки, можно воспользоваться функцией preg_replасе. В этом примере все встречающиеся слова cats, независимо от регистра букв, заменяются словами dogs:
echo preg_replace('/cats/i', "dogs", "Cats are fun. I like cats.");
Очень удобно использовать preg_replace, если нужно что-то выполнить с найденными соответствиями, например обернуть их в теги:
/* $n - содержимое сохраняющих групп, $0 - всё вхождение,
 $1 - содержимое первой запоминающей группы и т.д. */
$text = preg_replace('/\b(https?:\/\/[\wа-яё\/.\?&=#:+%\-;]+)/sui', '<a target="_blank" href="$1">$1</a>', $text); 
Если же нам нужно применить функцию к соответствиям, используется preg_replace_callback:
// делает комменты зелёным цветом в статьях
protected function get_comments($text) {
  if($text){
    $text = preg_replace_callback('/(^|[\s])(\/\/.*|##.*)\n?/u', 
    function($matches){
      return "<span class='commentsin' style=''>".strip_tags($matches[2])."</span>";
    }, $text);
    $text = preg_replace_callback('#/\*.+?\*/#s',
    function($matches){
      return "<span  class='commentsin' style=''>".strip_tags($matches[0])."</span>";
    }, $text);
    return $text;
  }
  return false;
}
Функция preg_grep($pattern, $input, $flag=0) возвращает массив, состоящий из элементов входящего массива $input, которые соответствуют заданному шаблону
// Возвращает все элементы массива, содержащие числа с плавающей точкой
$fl_array = preg_grep("/^(\d+)?\.\d+$/", $array);
В случае, если $flag установлен в PREG_GREP_INVERT, функция preg_grep() возвращает те элементы массива, которые не соответствуют заданному шаблону.
Очень полезна функция preg_quote()($string, $delimiter = NULL), которая принимает строку и добавляет обратный слеш перед каждым служебным символом. В случае если указан необязательный параметр delimiter, он будет также экранироваться. Это удобно для экранирования разделителя, который используется в PCRE функциях. Наиболее распространенным разделителем является символ '/'.
// В данном примере preg_quote($word) используется, чтобы избежать трактовки символа '*' как спец. символа.

$textbody = "Эту книгу *очень* тяжело найти.";
$word = "*очень*";
$textbody = preg_replace ("/" . preg_quote($word, '/') . "/",
                          "<i>" . $word . "</i>",
                          $textbody);
И, наконец preg_split( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]]) разбивает строку по регулярному выражению.
flags может быть любой комбинацией следующих флагов (объединенных с помощью побитового оператора |):
PREG_SPLIT_NO_EMPTY
Если указан этот флаг, функция preg_split() вернет только непустые подстроки.
PREG_SPLIT_DELIM_CAPTURE
Если указан этот флаг, выражение, заключенное в круглые скобки в разделяющем шаблоне, также извлекается из заданной строки и возвращается функцией.
PREG_SPLIT_OFFSET_CAPTURE
Если указан этот флаг, для каждой найденной подстроки будет указана ее позиция в исходной строке. Необходимо помнить, что этот флаг меняет формат возвращаемого массива: каждый элемент будет содержать массив, содержащий в индексе с номером 0 найденную подстроку, а смещение этой подстроки в параметре subject - в индексе 1.
// разбиваем строку по произвольному числу запятых и пробельных символов, которые включают в себя  " ", \r, \t, \n и \f
$keywords = preg_split("/[\s,]+/", "hypertext language, programming");
print_r($keywords);
2015.07.07 126

Вовочкa: - Пaпa, a что тaкое клитор ? Пaпa,не отрывaясь от компa: - Язык прогрaммировaния. Рaботaет с фaйлaми DBF формaтa.
Войдите или Зарегистрируйтесь чтобы оставить комментарий

Комментарии


    Яндекс.Метрика Яндекс.Метрика