Замена всех чисел (и только чисел) внутри & lt; sup & gt; теги

У меня много проблем, чтобы заставить регулярное выражение работать, чтобы сделать некоторые замены по всей строке.

Мне нужно найти и заменить все цифры (и только цифры) внутри <sup> теги, обертывающие каждый из них в три фигурные скобки (т.е. {{{1}}}). Они могут быть написаны разными способами, такими как:

<sup>1</sup>
<sup>1, 2</sup>
<sup>1, 2, 3</sup>
<sup>1, 2, 3\-4</sup>
<sup>1, 2, 3- 4</sup>

Ожидаемый результат для этих примеров должен быть примерно таким:

<sup>{{{1}}}</sup>
<sup>{{{1}}}, {{{2}}}</sup>
<sup>{{{1}}}, {{{2}}}, {{{3}}}</sup>
<sup>{{{1}}}, {{{2}}}, {{{3}}}\-{{{4}}}</sup>
<sup>{{{1}}}, {{{2}}}, {{{3}}}- {{{4}}}</sup>

К сожалению, я пробовал кучу вещей, но не мог заставить ничего работать. Один пример:

#<sup>([^<\d]*)(\d+)([^<]*)</sup>#

Работает с <sup>123</sup> пример и совпадет с первым числом в других примерах, но после первого ничего не получится.

Любая помощь и / или подсказка будут очень благодарны.

Заранее спасибо!

0

Решение

Так как не может быть вложенных <sup> теги, кажется, вы можете использовать регулярное выражение для этой задачи.

Самый простой подход, чтобы соответствовать всем <sup> теги (с простым '~<sup>[^<]*</sup>~') и замените все куски цифр на то, что вам нужно внутри обратного вызова (используя очень простой '~\d+~' регулярное выражение):

$s = '<sup>1, 2, 3- 124</sup>';
echo preg_replace_callback('~<sup>[^<]*</sup>~', function ($m) {
return preg_replace('~\d+~', '{{{$0}}}', $m[0]);
}, $s);
// => <sup>{{{1}}}, {{{2}}}, {{{3}}}- {{{124}}}</sup>

Увидеть PHP демо

Если вы предпочитаете использовать 1-регулярное выражение с preg_replace, использовать \G на основе регулярных выражений:

~(?:\G(?!\A)[^\d<]*|<sup>[^\d<]*)\K\d+~

Увидеть regex demo а также еще одна демонстрация PHP:

$s = '<sup>1, 2, 3- 124</sup> 2345';
echo preg_replace('~(?:\G(?!\A)[^\d<]*|<sup>[^\d<]*)\K\d+~', '{{{$0}}}', $s);
// => <sup>{{{1}}}, {{{2}}}, {{{3}}}- {{{124}}}</sup> 2345

подробности:

  • (?:\G(?!\A)[^\d<]*|<sup>[^\d<]*) — пользовательская граница, любая из двух:
    • \G(?!\A)[^\d<]* — конец предыдущего успешного матча (\G(?!\A)) а затем 0+ символов кроме < и цифры
    • | — или же
    • <sup>[^\d<]*<sup> и 0+ символов кроме < и цифры
  • \K — оператор, опускающий весь текст, соответствующий до настоящего времени в текущей итерации
  • \d+ — 1+ цифр
2

Другие решения

Вы можете использовать этот код:

function sanitizeString($string) {

// matriz de entrada
$what = array('0','1','2','3','4','5','6','7','8','9');

// matriz de saída
$by = array('{{0}}','{{1}}','{{2}}','{{3}}','{{4}}','{{5}}','{{6}}','{{7}}','{{8}}','{{9}}');

// devolver a string
return str_replace($what, $by, $string);
}

echo sanitizeString("hoje é dia 1 testando o 2");

Это самый простой способ без использования регулярных выражений.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector