Найдите несколько сумм в строке и оберните их

#php #html #regex #str-replace

Вопрос:

Я хочу найти любую сумму в долларах в строке и обернуть ее тегами span. Например, я хотел бы отредактировать эту строку:
Save $15 when you spend $150.
В это:
Save <span>$15</span> when you spend <span>$150.</span>

Это то, что у меня есть до сих пор:

 $the_text = "Save $15 when you spend $150.";
if (preg_match('/(?<=$)d (,d )?b/', $the_text, $regs)) {
   foreach ($regs as $amount) {
      $offer_text = str_replace("$","<span>$",$offer_text);
      $offer_text = str_replace($amount,$amount."</span> ",$offer_text);
   }
}
 

Это работает для меня всякий раз, когда в строке содержится только одна сумма в долларах или если строка содержит несколько сумм в долларах с разными целыми числами. Но в данном конкретном случае код выводит следующее:
Save <span>$15</span> when you spend <span>$15</span>0.

Есть идеи о том, как улучшить код, чтобы отслеживать все случаи?

Комментарии:

1. Имеет очень мало смысла идти и заменять $ что <span>$ — то подобное-потому что это, очевидно, приведет уже <span><span>$ ко второй итерации цикла. preg_replace Для начала вам следует сделать это с помощью.

Ответ №1:

Я не специалист по PHP, но когда я возился с ним, я просто использовал:

 $d (?:,d )?b
 

И заменил его на <span>$0</span> . Смотрите онлайн-демонстрацию

  • $d — Буквенный знак доллара и 1 цифр.
  • (?:,d )? — Необязательная группа без захвата, соответствующая запятой и 1 цифрам.
  • b — Граница слов.

 <?php
$the_text = "Save $15 when you spend $150.";
echo preg_replace('/$d (?:,d )?b/', '<span>$0</span>', $the_text);
?>
 

С принтами:

 Save <span>$15</span> when you spend <span>$150</span>.