#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>.