|
|
|
| условие - нужно написать код, чтобы в тексте подсвечивалось тегом <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], результат выполнения - вырезается текст ктоорый должен был быть найден.
если задавать без учета окончаний то слова обрезаются на половину.
помогите, плис, дописать задание, сам уже незнаю куда продолжать. | |
|
|
|
|
|
|
|
для: 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>", $sText, 1);
echo $sText;
?>
|
| |
|
|
|
|