Как найти строку, которую невозможно найти?
"Сложный поиск строки" - изложение решения задачки...
Давно работающий скрипт - установка дополнительной строки(значение переменное), до или после найденной строки... - перестал работать
Пример решения задачки Сложный поиск строки
Сложный поиск строки - описание...
Далее в коде... постоянное, только атрибуты классов, остальные значения + html - это переменные! Которые меняются в зависимости от страницы!
Нам нужно в то место ... в ниже приведенном коде, на место где располагается красный текст поместить свой элемент...
<ol class="count_levels">
<li><a href="#paragraph_1">заголовок</a></li>
<li><a href="#paragraph_2">заголовок</a></li>
</ol>
<ol class="count">
<a name="paragraph_1"></a><li></li>
<h2>Заголовок</h2>
<a name="paragraph_2"></a><li></li>
<h2>Заголовок</h2>
Для представленого кода есть простое решение!
Решение - нахождение и замена:
Мы можем воспользоваться preg_match_all. Получаем все, что есть между
И следующим тегом
В выражении будет так:
Далее заменяем полученную ячейку
На такую же, но только с добавленным содержанием:
И выводим с помощью echo
Код в сборе:
$example = '<ol class="count_levels">
<li><a href="#paragraph_1">заголовок</a></li>
<li><a href="#paragraph_2">заголовок</a></li>
</ol>
<ol class="count">
<a name="paragraph_1"></a><li></li>
<h2>Заголовок</h2>
<a name="paragraph_2"></a><li></li>
<h2>Заголовок</h2>';
preg_match_all('#class="count_levels">(.+?)</ol>#is', $example, $arr);
echo str_replace($arr[1][0] , $arr[1][0]."\n Добавляемый элемент" , $example);
посмотреть результат...Сложный поиск строки - вариант №2
Но далее... если html усложняется... в виде вложенного "<ol>" - то выше приведенный вариант перестает работать - посмотреть результат... и вообще все другие варианты, которые я знаю...
Как решить?
$example = '
<ol class="count_levels">
<li><a href="#paragraph_1">заголовок</a>
<ol class="count_levels">
<li><a href="#level_1">заголовок</a></li>
<li><a href="#level_2">заголовок2</a></li>
</ol>
</li>
<li><a href="#paragraph_2">заголовок</a></li>
</ol>
<ol class="count">
<a name="paragraph_1"></a><li></li>
<h2>Заголовок</h2>
<a name="paragraph_2"></a><li></li>
<h2>Заголовок</h2>';
preg_match_all('#class="count_levels">(.+?)</ol>#is', $example, $arr);
echo str_replace($arr[1][0] , $arr[1][0]."\n <b style='color:red;'>Добавляемый элемент</b>" , $example);
Решение, которое работает всегда!
Интересно, что самые не элегантные решения - работают всегда!
Итак... что нам надо?
Нам нужна функция... которая удаляет пустые ячейки массива + восстанавливает нумерацию массива.
Далее... нам нужно получить все до первого:
Разобьем в массив с помощью explode и получим первую часть массива используя current
Мы получим :
<li><a href="#paragraph_1">заголовок</a></li>
<li><a href="#paragraph_2">заголовок</a></li>
</ol>
Теперь - я могу разбить полученный код по "</li>" и я знаю точно, что в предпоследней ячейке будет лежать моя строка(paragraph_2)...
И далее... заменяем предпоследнюю строку в начальном тексте:
function dec(array $array, array $symbols = array('', NULL, false)) { return array_diff(array_map('trim', $array), $symbols); }
$example = '
<ol class="count_levels">
<li><a href="#paragraph_1">заголовок</a>
<ol class="count_levels">
<li><a href="#level_1">заголовок</a></li>
<li><a href="#level_2">заголовок2</a></li>
</ol>
</li>
<li><a href="#paragraph_2">заголовок</a></li>
</ol>
<ol class="count">
<a name="paragraph_1"></a><li></li>
<h2>Заголовок</h2>
<a name="paragraph_2"></a><li></li>
<h2>Заголовок</h2>';
$arr = dec( explode('</li>', current(explode('<ol class="count">', $example))));
echo str_replace($arr[count($arr)-2].'</li>' , $arr[count($arr)-2].'</li>'."<b style='color:red;'>Добавляемый элемент</b>" , $example);