PHP在不同的跨度中包装最后和第二到最后一个字母


PHP Wrap Last and 2nd To Last Letter in Different Spans

我想在span类"testing2"和span类"testing"的最后一个字母中包装第2到最后一个字母。我知道怎么写最后一个字母了,但是倒数第二个字母呢?

echo preg_replace('/(.)$/', '<span class="testing">'1</span>', $title)

这个正则表达式将找到字符串中的最后两个字母并分别捕获它们。

.*([a-zA-Z])([a-zA-Z]).*$

演示:https://regex101.com/r/yR1sT8/1

PHP使用方法:

$string = 'aaffffs3.4.4asdf234f4f3_+!#>,3';
preg_match('/.*([a-zA-Z])([a-zA-Z]).*$/', $string, $letters);
print_r($letters);
输出:

Array
(
    [0] => aaffffs3.4.4asdf234f4f3_+!#>,3
    [1] => d
    [2] => f
)

…或…

$string = 'aaffffs3.4.4asdf234f4f3_+!#>,3';
echo preg_replace('/.*([a-zA-Z])([a-zA-Z]).*$/', '<span class="testing2">$1</span><span class="testing">$2</span>',$string);
输出:

<span class="testing2">d</span><span class="testing">f</span>

如果你不关心最后一个letters,只想要任何字符,那么(.)(.)$就简单多了。

可能的选择:https://regex101.com/r/yR1sT8/2

更新:

为了保持之前的值,我们只需要添加额外的捕获组。

$string = 'aaffffs3.4.4asdf234f4f3_+!#>,3';
echo preg_replace('/(.*)([a-zA-Z])([a-zA-Z])(.*)$/', '$1<span class="testing2">$2</span><span class="testing">$3</span>$4',$string);
输出:

aaffffs3.4.4as<span class="testing2">d</span><span class="testing">f</span>234f4f3_+!#>,3

附加:

()为捕获组。其中的任何内容都被分组,可以以多种方式使用。例如,假设你想评估一个句子,你不关心单词the开始,你可以这样做。

`(?:The)? wolf was walking down the street`

这里the被分组,?使整个单词可选。?:使捕获组不捕获,因此$1不会出现在这里。$1$2等按照它们在正则表达式中出现的顺序命名。您可以在这里阅读更多关于捕获组的信息,http://www.regular-expressions.info/refcapture.html和http://www.rexegg.com/regex-capture.html。根据语言的不同,对捕获值的引用可能是'1

最简单的是一个断言,而不仅仅是$:

(?=.$|$)

这将导致(.)在结尾前一个字母匹配。