我对 完全陌生preg_replace
,但下面的代码从我的字符串中删除了最后一个单词:
preg_replace('/\W\w+\s*(\W*)$/', '$1', $var);
我正在尝试修改它,以便它删除最后两个单词。
我唯一能想到的就是替换$1
为$2
,但这似乎根本没有任何效果,可能只是愚蠢:/
有问题的字符串看起来像这样:
Lorem ipsum dolor sit amet. Source: LOREM
我想删除Source: LOREM
我对 完全陌生preg_replace
,但下面的代码从我的字符串中删除了最后一个单词:
preg_replace('/\W\w+\s*(\W*)$/', '$1', $var);
我正在尝试修改它,以便它删除最后两个单词。
我唯一能想到的就是替换$1
为$2
,但这似乎根本没有任何效果,可能只是愚蠢:/
有问题的字符串看起来像这样:
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 );
您不必在这里使用正则表达式。假设您将单词定义为被空格包围的任何内容:
$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 组括号()。所以你需要第二组。如果您实际上不需要交换某些内容,则可以使用更有针对性的方法。
.*(?=\s\D+\s)
应该让你更接近。此外,对我来说,一个救生员(真的可以节省时间)是http://regexpal.com/ 没有它我不会编写 RegEx 代码。