-2

我有以下声明

echo preg_replace("/(?<=\d)(th|rd|st|nd)([^0-z])/i","<sup>$1</sup>$2","some text 1st<br />\n2nd<br />\n3rd<br />\n4th 5th 21nd 33rd 41st<br />\nsome text");

它输出

some text 1st<br />
2nd<br />
3rd<br />
4<sup>th</sup> 5<sup>th</sup> 21<sup>nd</sup> 33<sup>rd</sup> 41st<br />
some text

我只是不知道如何在所有情况下用上标标签包围 th、rd、st 或 nd。

4

2 回答 2

1

你可以使用

/(?:\b\d+)(th|rd|st|nd)\b/i

//boundary \b is required here or else it would also replace within a word

并将其替换为

<sup>$1</sup>
于 2012-12-12T16:44:22.180 回答
0

[0-z]还包括以下符号::;<=>?@[]^_`

值得注意的是,<包括在内。

试试[^[:alnum:]]吧。

编辑:此外,为什么不让它向前看呢?

/(?<=\d)(?:th|rd|st|nd)(?=![[:alnum:]])/i

然后你可以$0在替换字符串中使用。

于 2012-12-12T16:40:37.843 回答