Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Подсветить словосочетание и 1-2 слова до и после него
 
 автор: aibolit   (13.09.2011 в 15:48)   письмо автору
 
 

условие - нужно написать код, чтобы в тексте подсвечивалось тегом <b> первое вхождение искомой строки и учетом окончаний и захватывало1-2 слова с переди или сзади найденого слова, и при этом если это первое вхождение уже подсвечено тегом <b> или <strong> то дальше ничего не выполнять.

вот что получилось
setlocale(LC_CTYPE, array('ru_RU.utf8', 'ru_UA.utf8'));
setlocale(LC_ALL, array('ru_RU.utf8', 'ru_UA.utf8'));

$sText = 'Компьютер был изобретен для того, чтобы избавить 
человека от лишней работы. Развитие компьютерных технологий 
привело к тому, что человек стал стремиться все меньше 
времени проводить за компьютером. Допустим, вы программист. 
Не будь компьютера, вы бы остались без работы. Но в то же 
время вы стараетесь с помощью компьютера упростить свою 
ежедневную работы, с этой целью вы используете, например, 
функцию автозавершения кода в редакторе. Мы хотим подвести 
вас к той мысли, что код созданный вами, должен быть 
организован так, чтобы работы по его модификации были 
сведены к минимуму. Чаще всего это удается, когда вы 
создаете код, автоматизирующий рутинные операции, такие как 
создание и прорисовка формы, а так же отправка e-mail. 
Однако не стоит забывать, что функции для выполнения 
рутинных операций никогда не бывают на 100% идентичными в 
различных приложениях. Один формуляр не похож на другой, а 
сообщения электронной почты предназначены разным адресатам. 
Однако логика на уровне приложения остается прежней, 
функции различаются между собой только некоторыми 
параметрами. Таким образом, вы должны ясно представлять 
свою цель – разработать код, параметры которого можно было 
бы определять извне.';
//$sTpl = 'рутинн% операц%';
$sTpl = 'рутинные операции';
$first = true;

$pattern = array();
$main_find = array();

$sPregSearch = str_replace("%", "[а-яА-Яa-zA-Z]+", $sTpl);
$pregFirst = "/[а-яА-ЯA-Za-z-]{2,}\s" . $sPregSearch . "/"; //  поиск слова спереди
$pregLast = "/" . $sPregSearch . "\s[а-яА-ЯA-Za-z-]{2,}/"; //поиск слова сзади
echo
$sPregSearch = '/' . $sPregSearch . '/u';
echo '<br/>';

if (preg_match($sPregSearch, $sText, $main_find, PREG_OFFSET_CAPTURE)) {

    $main_find[0][1] < 40 ? $length = $main_find[0][1] : $length = 40;

    $findin = mb_substr($sText, $main_find[0][1] - $length, 2 * $length); //  подстрока вхождения (кусок найденного текста)

    $first = preg_match($pregFirst, $findin, $array); //есть ли слово спереди true/false

    $last = preg_match($pregLast, $findin, $array); ////есть ли слово позади true/false


    if ($first == true) {
    $pattern[] = $pregFirst;
    }
    if ($last == true) {
    $pattern[] = $pregLast;
    }
    if ($first == false && $last == false) {
    $pattern[] = $sPregSearch;
    }
    /*  подсвечиваем в кусок найденного  текста */
    $findin = preg_replace(count($pattern) > 1 ? ($pattern[rand(0, 1)]) : $pattern[0], '<b>$0</b>', $findin, 1);

    if (!$sPartOne = mb_substr($sText, 0, $main_find[0][1] - $length > 0 ? $main_find[0][1] - $length : $length)) { //кусок до найденно текста
    $sPartOne = $sText;
    } else {
    $main_find[0][1] - $length > 0 ? $sPartOne .= $findin : $sPartOne = $findin;

    if (!$sPartTwo = mb_substr($sText, $main_find[0][1] + $length)) { //кусок после найденного текста
        $sPartTwo = $sText;
    } else {
        $sPartOne .= $sPartTwo;
    }
    $sText = $sPartOne;
    }
}
echo $sText;


подстановку окончаний я задал на знак % перед поиском % заменяется на [а-яА-Яa-zA-Z], результат выполнения - вырезается текст ктоорый должен был быть найден.
если задавать без учета окончаний то слова обрезаются на половину.

помогите, плис, дописать задание, сам уже незнаю куда продолжать.

  Ответить  
 
 автор: cheops   (13.09.2011 в 19:18)   письмо автору
 
   для: aibolit   (13.09.2011 в 15:48)
 

Что-то как-то больно сложно получилось... У preg_replace() есть необязательный четвертый параметр, в нём можно задать количество подстановок (в вашем случае 1). Это сильно упростит вашу задачу. Можно начать отталкиваться от следующего решения.
<?php
  $sText 
'Компьютер был изобретен для того, чтобы избавить  
  человека от лишней работы. Развитие компьютерных технологий  
  привело к тому, что человек стал стремиться все меньше  
  времени проводить за компьютером. Допустим, вы программист.  
  Не будь компьютера, вы бы остались без работы. Но в то же  
  время вы стараетесь с помощью компьютера упростить свою  
  ежедневную работы, с этой целью вы используете, например,  
  функцию автозавершения кода в редакторе. Мы хотим подвести  
  вас к той мысли, что код созданный вами, должен быть  
  организован так, чтобы работы по его модификации были  
  сведены к минимуму. Чаще всего это удается, когда вы  
  создаете код, автоматизирующий рутинные операции, такие как  
  создание и прорисовка формы, а так же отправка e-mail.  
  Однако не стоит забывать, что функции для выполнения  
  рутинных операций никогда не бывают на 100% идентичными в  
  различных приложениях. Один формуляр не похож на другой, а  
  сообщения электронной почты предназначены разным адресатам.  
  Однако логика на уровне приложения остается прежней,  
  функции различаются между собой только некоторыми  
  параметрами. Таким образом, вы должны ясно представлять  
  свою цель – разработать код, параметры которого можно было  
  бы определять извне.'

  
$sTpl 'рутинные\s+?операции'
  
$pattern "|\s+?[^\s]+?\s+?[^\s]+?[\s,.%]+?".$sTpl."[\s,.%]+?[^\s]+?\s+?[^\s]+?\s+?|is";
  
$sText preg_replace($pattern"<strong>\\0</strong>"$sText1);
  echo 
$sText;
?>

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования