Как читать строку на php?

Не знаю как точно сформулировать вопрос, но выходит так: можно ли добиться в php чтения текста в переменной подряд и по мере чтения в случае совпадения условия немедленно выполнять какие-то действия.
Т.е. как человек когда читает и по мере чтения сразу выделяет маркером что-то или тут же зачёркивает ненужное.
Пример 1: если в тексте есть слово php и после него где-то в тексте найдено слово java то... удалить предыдущее слово php.
<p>Ох уж этот php хотя java адский ад лучше уж пусть php</p>

Пример 2: если в тексте есть заголовок (конструкция h1... /h1) а после него где-то есть тег br а после него подзаголовок (h2... /h2) то... убрать тег br между ними.
<h1>Заголовок</h1> текст <br> текст <h2>Подзаголовок</h2>

В общем виде ясно что нужно выхватывать нужные диапазоны регуляркой, сложить в массив потом просмотреть элементы массива, заменить их потом вставить изменённые обратно в текст. Но во-первых довольно много лишних действий, во-вторых если есть одинаковые элементы в массиве то потом фиг два задашь где именно эти элементы в тексте и что именно их нужно поменять. Может мне нужен другой язык программирования? Если да то какой?
  • Вопрос задан
  • 381 просмотр
Решения вопроса 2
slashinin
@slashinin
Задачи для PHP https://justcoding.ru
PHP отличный язык на котором можно реализовать практически любой алгоритм.
В первом случаи вы можете использовать функцию explode с разделителем в виде пробела, получите массив на выходе ровно в том порядке, в котором идут слова. А дальше обрабатывайте массив как угодно.

Во втором случаи можно так же использовать explode только при переборе массива учитывать начало и конец заголовка, выставлять флаг начала и флаг конца тега.

Все в ваших руках.
Ответ написан
winordie
@winordie
Лучшая документация -- исходники
Можно регулярки использовать. Я php не знаю, поэтому буду использовать примеры для python, для php должно быть что то похожее.

Для нахождения нужных слов можно использовать префиксные и постфиксные проверки:
(?<=<условие>)<выражение> - <выражение> будет соответствовать шаблону только тогда, когда оно идет после выражения, которое соответствует шаблону <условие>.
(?)<выражение> - аналогично предыдущему, только будет совпадать, если <условие> НЕ будет совпадать.
(?=<условие>)<выражение> - постфиксное условие, <выражение> будет соответстовать, если после него идет выражение, которое соответствует шаблону <условие>
(?!<условие>)<выражение> - постфиксное условие с отрицанием

Для удаления есть метод sub(), на самом деле это замена, но кто нам помешает заменять на пустую строку.
Таким образом можно так:
your_string = '<p>Ох уж этот php хотя java адский ад лучше уж пусть php</p>'
p = re.compile( '(php)(?=.*java)')
p.sub('', your_string)


Для php вроди бы так будет:
$string = "<p>Ох уж этот php хотя java адский ад лучше уж пусть php</p>";
$string = ereg_replace('(php)(?=.*java)', '', $string);

php.net/manual/ru/function.ereg-replace.php
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@EpIvIaK
"Ох уж этот php хотя java адский ад лучше уж пусть php" - золотые слова, как мне актуально. Джава утомила за год обучения, хотя и польза думаю есть. Сейчас в PHP опять залез, как-то дышать стало проще.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы