2

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

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

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

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

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

Lorem ipsum dolor sit amet. Source: LOREM

我想删除Source: LOREM

4

4 回答 4

8

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

$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

于 2012-05-10T20:49:54.343 回答
1

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

$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);
于 2012-05-10T20:48:01.067 回答
1
$str = ' would like to remove Source: LOREM';
$str =  preg_replace('/(.*)\s+([a-zA-Z]+):\s+([a-zA-Z]+)$/', '$1', $str);
echo $str;
于 2012-05-10T21:00:20.167 回答
0

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

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

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

于 2012-05-10T20:48:59.443 回答