Replace / regex: поместите теги span вокруг чисел, за которыми следует %

#php #regex #preg-replace

#php #регулярное выражение #preg-заменить

Вопрос:

Я пытаюсь отсортировать все числа в строке (числа, за которыми следует знак%) в тегах span

Вот несколько попыток новичка в регулярных выражениях решить эту проблему:

 $str = preg_replace("/(1-9 )%/", "<span>$1</span>", $str);
  

или

 $str = preg_replace("/([1-9] )%/", "<span>$1</span>", $str);
  

Ничего не заменяется

Бьюсь об заклад, я все понял неправильно.. Мне нужно больше изучать regex, я знаю

Но можете ли вы помочь мне с этим дальше?

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

1. Второй вариант правильный. Вам придется подробнее остановиться на вашем использовании, контексте кода, вводе и выводе (вы действительно просматривали исходный код результата страницы?) чтобы получить какие-либо рекомендации.

2. Да, я пробовал просмотреть исходный код. Я также попытался строго установить $ str как «привет, 100% привет», чтобы посмотреть, изменило ли это что-нибудь. Ничего не заменяется

3. Действительно ли второе правильно? Это казалось довольно случайным / неправильным, когда я это писал (просто написал то, что, по моему мнению, было бы нормально)

4. Второй неверен

Ответ №1:

Ваше регулярное выражение почти правильное, но есть один важный сбой. Вы сопоставляете [1-9] вместо [0-9] .

РЕДАКТИРОВАТЬ: Использование preg_replace_callback для генерации случайного числа:

Следующее должно сработать:

 echo preg_replace_callback('/([0-9] )%/', function ($m) { 
       return '<span>' . rand($m[1]-5, $m[1] 5) . '%</span>'; }, 'hello 100% hello');
  

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

1. Да, я тоже обнаружил некоторые недостатки (см. Мой ответ)

2. Не имеет значения, помещаю ли я% внутрь или снаружи)?

3. Если вы не хотите, чтобы % в результирующей span строке было что-то не так, оставьте это вне соответствующей группы.

4. Хорошо, спасибо. Мне также нужно заменить число случайным числом, которое составляет от -5 до 5 от исходного числа. Есть ли быстрый и простой способ сделать это внутри preg_replace?

5. Вау, это потрясающе. И сложный (для меня). Большое вам спасибо 🙂 Я постараюсь извлечь из этого урок. Мне просто нужно было добавить знак% в span

Ответ №2:

Попробовав еще немного, это работает:

 $str = preg_replace('/[0-9]{1,3}%/', '<span>$0</span>', $str);
  

Использование () было первой ошибкой. Использование 1-9 вместо 0-9 было другой ошибкой. Использование $ 1 вместо $ 0 было третьей ошибкой (я думаю)

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

1. Просто используйте ([0-9] %) .