替换<sup>标记内的所有数字(仅限数字)

时间:2017-01-19 11:11:12

标签: php regex preg-replace

我有很多问题需要让正则表达式替换整个字符串。

我需要查找并替换<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>{#<sup>([^<\d]*)(\d+)([^<]*)</sup>#
}</sup>
<sup>{<sup>123</sup>}, {{{2}}}</sup>
<sup>{{{1}}}, {{{2}}}, {Limit on amount of rows retrieved MySql, Laravel}</sup>
<sup>{{{1}}}, {{{2}}}, {FB.XFBML.parse}\-{{{4}}}</sup>
<sup>{{{1}}}, {{{2}}}, {{{3}}}- {{{4}}}</sup>

这些示例的预期结果应该是:

{{1}}
可悲的是,我已经尝试了很多东西但却无法解决问题。一个例子:

{{1}}

它适用于{{1}}示例,并且会将第一个数字与其他示例匹配,但在第一个数字之后却无法获得任何内容。

非常感谢任何帮助和/或线索。

提前致谢!

2 个答案:

答案 0 :(得分:2)

由于可能没有嵌套的export class Diary { @observable loaded = false; @observable posts = []; @action getPosts() { axios({ method: 'get', url: '/api/diary/', headers: {'Authorization': "JWT " + sessionStorage.getItem('token')} }).then(action('response action', (response) => { (response.data).forEach(function (post) { /* Associative array is an OBJECT, NOT AN ARRAY ... */ var hiren = {}; hiren['id'] = post['id']; hiren['title'] = Crypt.decrypt(post['title'], key, post['iv']); hiren['content'] = Crypt.decrypt(post['content'], key, post['iv']); hiren['tag'] = post['tag']; hiren['date'] = moment.utc(post['date']).local().format("dddd, DD MMMM YYYY hh:mm:ss A"); this.posts.push(hiren); console.log(toJS(this.posts)); // empty array so the push is not working }); this.loaded = true; })).catch(function(err) { console.error(err); }); } } 标记,因此您似乎可以使用正则表达式完成此任务。

最简单的方法是匹配所有<sup>标记(仅仅<sup>)并将所有数字块替换为回调内所需的内容(使用非常简单的'~<sup>[^<]*</sup>~'正则表达式) :

'~\d+~'

请参阅PHP demo

如果您希望将1-regex方法与$s = '<sup>1, 2, 3- 124</sup>'; echo preg_replace_callback('~<sup>[^<]*</sup>~', function ($m) { return preg_replace('~\d+~', '{{{$0}}}', $m[0]); }, $s); // => <sup>{preg_replace}, {{{2}}}, {regex demo}- {{{124}}}</sup> 一起使用,请使用基于\G的正则表达式:

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

请参阅another PHP demohttp://api.jquery.com/category/selectors/

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

<强>详情:

  • \G(?!\A)[^\d<]* - 自定义边界,两者之一:
    • \G(?!\A) - 上一次成功匹配(<)的结束,然后是除|以外的0 +字符和数字
    • <sup>[^\d<]* - 或
    • <sup> - <以及除\K以外的0 +字符和数字
  • \d+ - 操作员省略当前迭代中到目前为止匹配的整个文本
  • map - 1+位数

答案 1 :(得分:0)

您可以使用此代码:

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}}','xml','{{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");

这是不使用正则表达式的最简单方法。