|
|
|
|
|
для: Stasyn
(08.01.2014 в 19:17)
| | Ну тогда еще одно решение:
<?
define("RUS_SUMB","йцукенгшщзхъфывапролджэячсмитьбюёЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ*");
$s = '**еще** слово слово **раз** слово слово слово слово **два** слово слово слово слово слово **три** слово слово слово';
$s = str_word_count($s, 1, RUS_SUMB); //или разбить по пробелу
foreach($s as $k=>$v) $s[$k] = $v[0]=='*' ? '<b>'.trim($v, '*').'</b>' : $v;
echo implode(' ', $s);
|
| |
|
|
|
|
|
|
|
для: confirm
(08.01.2014 в 17:26)
| | Большое вам спасибо за объяснение. | |
|
|
|
|
|
|
|
для: Stasyn
(08.01.2014 в 15:21)
| | Вы можете работать двояко - с "чистыми" данными, это значит пустые элементы полученные после разбиения выбросить. В этом случае нужно знать с какого элемента, с четного или нет нужно обрамлять текст. Либо пренебрегаем этим (не мешают пустые элементы), то просто всегда проверяем на четность.
Не то чтобы лень мне все было писать, просто некогда было, да и разговор то шел не о том как именно все закончено должно выглядеть, а просто о возможностях, поэтому не счел нужным "распространятся". Можно и подробнее:
1. "Чистота данных". Добавлять в условие тождественную проверку смыла нет для этого примера. Так как обусловливается, что разбивать текст нужно обязательно, а значит важно знать больше нуля или нулевое смещение имеет символ разделения. Если же действительно применять это на практике, то есть определять содержит ли текст необходимое для замены или нет, то да нужна тождественная проверка, чтобы это выяснить, но только для этого.
Если смещение больше нуля, то будет проверяться четный бит операцией XOR, поэтому $pst устанавливается равным 0, в противном случае 1. (Можно и иначе, просто в дальнейшей операции нужно инвертировать результат)
<?
$s = '**еще** слово слово **раз** слово слово слово слово **два** слово слово слово слово слово **три** слово слово слово';
//$s = 'слово слово **раз** слово слово слово слово **два** слово слово слово слово слово **три** слово слово слово';
$pst = strpos($s, '*') ? 0 : 1;
//удалим пустые элементы и сбросим индексы
$s = array_values(array_diff(explode('**', $s),['']));
//если маска индекса массива с проверкой бита положительная, обрамляем элемент
//а получается так
//для нечетных 0 & 1 ^ 1 = 1 - строка начиналась с разделителя
//для четных 1 & 0 ^ 1 = 1 - разделитель имеет смещение больше нуля
foreach($s as $k=>$v) $s[$k] = $k & 1 ^ $pst ? '<b>'.$v.'</b>' : $v;
|
2. Просто замена и соединение. Для этого не надо проверок в строке, а просто разбиваем на массив, при этом элементы которые надо обрамлять всегда будут четными, а значит:
<?
foreach($s as $k=>$v) $s[$k] = $k & 1 ? '<b>'.$v.'</b>' : $v;
|
Не обязательно и сохранять массив, можно сразу формировать строку в цикле. Необязательно разбивать, не обязательно и str_replace(), решить можно и по иному, если говорить "можно ли"? Конечно можно, например, можем мы мысленно представить входную строку как набор битов, единичные биты которой это символы, а нулевые биты замещаемые символы? Конечно можем, и, если пропустить эту последовательность через регистр, на выходе которого будет триггер определяющий ноль, то можно реагировать на появление нуля, а также какое положение в последовательности он занимает. А описать это, но уже программно тоже не проблема - если строка это элементы массива, то пройдясь циклом (регистр) по строке получаем каждый элемент, и если это символ (единица), то просто запоминаем, если замещаемый символ (ноль), то проверяем четный ли он по счету или нет (триггер), и замещаем соответствующим. | |
|
|
|
|
|
|
|
для: confirm
(07.01.2014 в 16:06)
| | Спасибо отличный пример, не как не мог найти применение оператору &, в условие $pst = strpos($s, '*') !== false? 0 : 1; я бы добавил проверку на неравенство false. | |
|
|
|
|
|
|
|
для: psychomc
(07.01.2014 в 20:07)
| | Ну если в лоб то да, а если нет, то не получится. | |
|
|
|
|
|
|
|
для: confirm
(07.01.2014 в 19:18)
| | ну в первом для строки:
**слово** слово **раз** слово слово слово слово **два** слово слово слово слово слово **три** слово слово **слово**
|
результат получился
<b></b>слово<b> слово </b>раз<b> слово слово слово слово </b>два<b> слово слово слово слово слово </b>три<b> слово слово </b>слово<b></b>
|
| |
|
|
|
|
|
|
|
для: psychomc
(07.01.2014 в 19:14)
| | Например несколько операций CISC процессора могут быть записаны в одном машинном слове, а RISC процессору придется это объяснять кучей инструкций. Да, первое выглядит "изящно" и "круто", но второе обшлепает первое по скорости за милую душу. Но никто не отказывается ни от первой, ни от второй архитектуры, каждая занимает свою нишу под свои задачи, там, где она выгодна.
Тоже самое и здесь. Это всего лишь примеры к дискуссии, не более, хотя первое полностью удовлетворяет, и второе можно сделать таковым. | |
|
|
|
|
|
|
|
для: Deed
(07.01.2014 в 18:49)
| | Нет, это не так, рег выражения это иной механизм. | |
|
|
|
|
|
|
|
для: confirm
(07.01.2014 в 19:07)
| | это всё понятно, конечно лучше по возможности использовать простые строковые функции. просто конкретно этот пример кажется неудачным. т.е уже достаточно много телодвижений и пока что ни одно решение полностью не удовлетворяет условию
*точнее нет удовлетворяет, но удовлетворять не будет при переносе **луне** в начало или в конец | |
|
|
|
|
|
|
|
для: psychomc
(07.01.2014 в 18:54)
| | Да причем тут производительность, хотя за краткостью может скрываться и прожорливость. Это как раз тогда, когда по всем пустякам и применяют рег. выражения, хотя выгоднее применять стандартные функции.
Самое плохое, это привычка думать "шаблоном", хуже этого быть не может, от этой привычки и порождена уверенность, что только рег. выражениями, а других способов нет. | |
|
|
|
|