@Bestolkovy

Почему не срабатывают уловия?

Добрый день!

Подскажите пожалуйста, почему не срабатывают условия?

Необходимо в тексте найти все буквы «a»
1. Если буква «a» стоит между двух букв «b» - вот так: «bab», то нужно заключить её в тег <b>, вот так: b<b>a<b>b;
2. Если буква «a» не стоит между двумя «b», то заключить её в тег <i> - вот так: <i>a<i>.

Это сильно-сильно упрощенная, необходимая мне конструкция, поэтому её необходимо сделать именно с помощью if else.

Что делаю я:

// ищем в тексте, поочереди, все буквы «а»
if ( preg_match( "/a/miu", $text ) ) {

  // далее поверяем, находится ли буква «a», между двух букв «b»
  if ( preg_match( "/bab/miu", $text ) ) {
    // если условие верно, то заключаем её в тег <b>
    $text = preg_replace( "/bab/miu", "b<b>a</b>b", $text );
  // во всех остальных случаях...
  } else {
    // заключаем её в тег <i>
    $text = preg_replace( "/a/miu", "<i>a</i>", $text );
  }

}


Почему-то, срабатывает только первая часть условия, вот это:

// далее поверяем, находится ли буква «a», между двух букв «b»
  if ( preg_match( "/bab/miu", $text ) ) {
    // если условие верно, то заключаем её в тег <b>
    $text = preg_replace( "/bab/miu", "b<b>a</b>b", $text );
  }


А вторая часть никогда не срабатывает, вот эта:

else {
    // заключаем её в тег <i>
    $text = preg_replace( "/a/miu", "<i>a</i>", $text );
  }


Почему? И как заставить её работать?......
  • Вопрос задан
  • 153 просмотра
Пригласить эксперта
Ответы на вопрос 3
@gladyshev18
Вероятно, потому что preg_match заканчивает свою работу после первого вхождения искомой строки в исходную.
После того как ты нашел первое вхождение a, дальше ничего не перебирается.
if ( preg_match( "/a/miu", $text ) )
а тут ты не продолжаешь поиск, а ищешь опять с начала строки и найдя bab preg_match прекратит работу, условие выполнится как истина, preg_replace поменяет bab, а в else будет работать если вообще bab не будет в строке.
if ( preg_match( "/bab/miu", $text ) )
Ответ написан
prototype_denis
@prototype_denis
Symfony
<?php 

$string = 'ababbbbbabaaababbabaa';
$string = str_replace('a', '<i>a</i>', $string);
$string = str_replace('b<i>a</i>b', 'b<b>a</b>b', $string);

var_dump($string);
Ответ написан
alsopub
@alsopub
Ваш код работает по следующему алгоритму:
1) Если в тексте есть "a", то
2) Если в тексте есть "bab", то сделать из них bab и закончить работу
3) Только если в тексте нет bab, то обработать a -> a

Лучше бы вы описали конкретную задачу, а то мы напишем код работающий с "a" и "b", и он может не сработать на реальных ваших условиях.
Ваша задача решается легко без if else, они только все усложняют, откуда такая необходимость в if else? Если это задача какая-то, то, скорее всего ее надо и без регулярок решать, раз уж if так необходимы.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы