Найти в тексте адрес E-mail

// \S означает "не пробел", а [a-z0-9.]+ -
// "любое число букв, цифр или точек". Модификатор 'i' после '/'
// заставляет PHP не учитывать регистр букв при поиске совпадений.
// Модификатор 's', стоящий рядом с 'i', говорит, что мы работаем
// в "однострочном режиме" (см. ниже в этой главе).
preg_match('/(\S+)@([a-z0-9.]+)/is', "Привет от somebody@mail.ru!", $p);
// Имя хоста будет в $p[2], а имя ящика (до @) - в $p[1].
echo "В тексте найдено: ящик - $p[1], хост - $p[2]";

Добавлено: 08 Августа 2018 08:20:05 Добавил: Андрей Ковальчук

Разбор адесов E-mail.

$text = "Адреса: user-first@mail.ru, second.user@mail.ru.";
$html = preg_replace(
  '{
    [\w-.]+             # имя ящика
    @
    [\w-]+(\.[\w-]+)*   # имя хоста
  }xs',
  '<a href="mailto:$0">$0</a>',
  $text
);
echo $html;

То же самое, но немножко по-другому:
$html = preg_replace( '/(\S+)@([a-z0-9.-]+)/is', '<a href="mailto:$0">$0</a>', $text);

Добавлено: 08 Августа 2018 08:19:08 Добавил: Андрей Ковальчук

Найти и заменить все &quot;http://&quot; на ссылки

Вариант 1:

$text = preg_replace('#(?<!\])\bhttp://[^\s\[<]+#i',
	"<a href=\"$0\" target=_blank><u>Посмотреть на сайте</u></a>",
	nl2br(stripslashes($text)));

Вариант 2, с выделением домена:

// Cuts off long URLs at $url_length, and appends "..."
function reduceurl($url, $url_length) {
    $reduced_url = substr($url, 0, $url_length);
    if (strlen($url) > $url_length) $reduced_url .= '...';
    return $reduced_url;
}

$linktext = preg_replace("#\[(([a-zA-Z]+://)([a-zA-Z0-9?&%.;:/=+_-]*))\]#e", "'<a href=\"$1\" target=\"_blank\">' . reduceurl(\"$3\", 30) . '</a>'", $linktext);

Еще один вариант, учитывающий "WWW."

// match protocol://address/path/file.extension?some=variable&another=asf%
$text = preg_replace("/\s(([a-zA-Z]+:\/\/)([a-z][a-z0-9_\..-]*[a-z]{2,6})([a-zA-Z0-9\/*-?&%]*))\s/i", " <a href=\"$1\">$3</a> ", $text);

// match www.something.domain/path/file.extension?some=variable&another=asf%
$text = preg_replace("/\s(www\.([a-z][a-z0-9_\..-]*[a-z]{2,6})([a-zA-Z0-9\/*-?&%]*))\s/i", " <a href=\"http://$1\">$2</a> ", $text);

Добавлено: 08 Августа 2018 08:18:40 Добавил: Андрей Ковальчук

Конвертор HTML в текст

// $document на выходе должен содержать HTML-документ.
// Необходимо удалить все HTML-теги, секции javascript,
// пробельные символы. Также необходимо заменить некоторые
// HTML-сущности на их эквивалент.

$search = array ("'<script[^>]*?>.*?</script>'si",  // Вырезает javaScript
                 "'<[\/\!]*?[^<>]*?>'si",           // Вырезает HTML-теги
                 "'([\r\n])[\s]+'",                 // Вырезает пробельные символы
                 "'&(quot|#34);'i",                 // Заменяет HTML-сущности
                 "'&(amp|#38);'i",
                 "'&(lt|#60);'i",
                 "'&(gt|#62);'i",
                 "'&(nbsp|#160);'i",
                 "'&(iexcl|#161);'i",
                 "'&(cent|#162);'i",
                 "'&(pound|#163);'i",
                 "'&(copy|#169);'i",
                 "'&#(\d+);'e");                    // интерпретировать как php-код

$replace = array ("",
                  "",
                  "\\1",
                  "\"",
                  "&",
                  "<",
                  ">",
                  " ",
                  chr(161),
                  chr(162),
                  chr(163),
                  chr(169),
                  "chr(\\1)");

$text = preg_replace($search, $replace, $document);

Добавлено: 08 Августа 2018 08:17:59 Добавил: Андрей Ковальчук

Выбрать все параметры:

$string = '<table border=\'0\'       cellpadding  = "0" cellspacing=0 style= "border-collapse: collapse">';
if (preg_match_all('#\s+([^=\s]+)\s*=\s*((?(?="|\') (?:"|\')([^"\']+)(?:"|\') | ([^\s]+)))#isx', $string, $matches)) {
  print_r($matches);
}
Array ( [0] => Array ( [0] => border='0' [1] => cellpadding = "0" [2] => cellspacing=0 [3] => style= "border-collapse: collapse" ) [1] => Array ( [0] => border [1] => cellpadding [2] => cellspacing [3] => style ) [2] => Array ( [0] => '0' [1] => "0" [2] => 0 [3] => "border-collapse: collapse" ) [3] => Array ( [0] => 0 [1] => 0 [2] => [3] => border-collapse: collapse ) [4] => Array ( [0] => [1] => [2] => 0 [3] => ) )

Добавлено: 08 Августа 2018 08:17:21 Добавил: Андрей Ковальчук

Выбрать локальные URL

Как можно выбрать не просто все урлы в HTML странице а те которые не начинаются на http://, другими словами локальные.

preg_match_all("#\s(?:href|src|url)=(?:[\"\'])?(.*?)(?:[\"\'])?(?:[\s\>])#i", $buffer, $matches);

Добавлено: 08 Августа 2018 08:16:50 Добавил: Андрей Ковальчук

Проверка 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|[a-z]{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("~^[a-z]+~ie","strtolower('\\0')",$url);
   return $url;
}

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

$url=checkurl($url); // перезаписали УРЛ в самого себя
if ($url) exit("Ошибочный URL");

// Returns true if "abc" is found anywhere in $string.
preg_match("/abc/", $string);
// Returns true if "abc" is found at the beginning of $string.
preg_match("/^abc/", $string);
// Returns true if "abc" is found at the end of $string.
preg_match("/abc$/", $string);

Добавлено: 08 Августа 2018 08:13:36 Добавил: Андрей Ковальчук

Сложная замена

В тексте есть некоторые слова, допустим "СЛОВО" и "ЛЯЛЯЛЯ" (и т.д.), которые нужно одинаковым образом заменить на тоже самое, но с добавками. Возможно, слова отсутствуют или встречаются много раз в любом регистре.

Т.е. если было "слово" или "СлОвО" (или еще как), нужно заменить это на "<b>слово</b>" или "<b>СлОвО</b>" (смотря, как было). Другими словами нужно найти перечень слов в любом регистре и вставить по краям найленных слов фиксированные строки (на "<b>" и "</b>").

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

Добавлено: 08 Августа 2018 08:12:44 Добавил: Андрей Ковальчук

Удаление многократно повторяющихся знаков препинания

Удаление знаков препинания, которые повторяются больше 3 раз, т.е. !!!!! -> !!!, ????? -> ??? и т.д. Заменяются следующие символы: . ! ? ( )

$text = preg_replace('#(\.|\?|!|\(|\)){3,}#', '\1\1\1', $text);

Добавлено: 08 Августа 2018 08:12:21 Добавил: Андрей Ковальчук

Заменить все повторяющиеся пробелы на один

Не пытайтесь здесь применить str_replace, это хорошая функция, но не для данного примера.

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

Добавлено: 08 Августа 2018 08:11:58 Добавил: Андрей Ковальчук