PHP包裹不同跨度的最后和第2个到最后一封信

时间:2015-09-26 14:16:05

标签: php regex

我想用一个"测试2"在一个范围内包装第二个到最后一个字母。和班级的最后一个字母"测试"。我得到了如何做最后一封信,但是第二封信到底是怎么回事?

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

2 个答案:

答案 0 :(得分:2)

此正则表达式将在字符串中找到最后2个字母并单独捕获它们。

.*([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.htmlhttp://www.rexegg.com/regex-capture.html。根据语言,对捕获值的引用可能为\1

答案 1 :(得分:0)

最简单的是assertion,而不仅仅是$

(?=.$|$)

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