从字符串中删除最后两个单词


Remove last two words from a string

我对preg_replace完全陌生,但下面的代码从我的字符串中删除了最后一个单词:

preg_replace('/'W'w+'s*('W*)$/', '$1', $var);

我正在尝试修改它,以便它删除最后两个单词。

我唯一能想到的就是用$2替换$1,但这似乎根本没有任何效果,可能只是愚蠢:/

有问题的字符串看起来有点像这样:

Lorem ipsum dolor sit amet. Source: LOREM

我想删除Source: LOREM

一个简单的正则表达式可以匹配一个空格,后跟任意数量的字母(或冒号),后跟一个空格,后跟字符串末尾的任意数量的字母:

$str = "Lorem ipsum dolor sit amet. Source: LOREM";
$str = preg_replace( "/'s[a-z:]+'s[a-z]+$/i", "", $str );
// Lorem ipsum dolor sit amet.
echo $str;

细分的表达式如下:

's       // Single space
[a-z:]+  // Any letter, a to z, or a colon, 1 or more times
's       // Single space
[a-z]+   // Any letter, a to z, 1 or more times
$        // End of string

演示:http://codepad.org/G22LnDDY

另一种方法是使用 explode 创建一个单词数组,并删除最后两个。

$str = "Lorem ipsum dolor sit amet. Source: LOREM";
$words = explode( " ", $str );
array_splice( $words, -2 );
// Lorem ipsum dolor sit amet.
echo implode( " ", $words );

演示:http://codepad.org/6XwqvwuP

不必在此处使用正则表达式。假设您将一个单词定义为被空格包围的任何内容:

$words = explode(' ', 'Lorem ipsum dolor sit amet. Source: LOREM');
if (count($words) >= 2) {
    array_pop($words);
    array_pop($words);
}
$words = implode(' ', $words);

或:

$words = explode(' ', 'Lorem ipsum dolor sit amet. Source: LOREM');
if (count($words) >= 2) {
    $words = array_slice($words, 0, count($words) - 2);
}
$words = implode(' ', $words);
$str = ' would like to remove Source: LOREM';
$str =  preg_replace('/(.*)'s+([a-zA-Z]+):'s+([a-zA-Z]+)$/', '$1', $str);
echo $str;

$1 实际上是用于替换的分组捕获,因此可以将其视为$n,$n+1。您的正则表达式中只有 1 个组 parens ()。所以你需要第二套。如果您实际上不需要交换某些内容,则可以使用更有针对性的方法。

.*(?=''s''D+''s)

应该让你更接近。此外,对我来说是一个救生员(真的是节省时间)是 http://regexpal.com/没有它,我不会编写正则表达式。